Android 配置蓝牙遥控器键值

文章目录

  • 篇头
  • 一、规格书
  • 二、红外按键配置
  • 三、蓝牙按键配置
    • 3.1 查看设备号
      • 3.1.1 方式一:dumpsys input
      • 3.1.2 方式二: cat /proc/bus/input/devices
    • 3.2 配置kl文件
      • 3.2.1 方案商原始配置
      • 3.2.2 Generic.kl 文件
      • 3.2.3 重映射蓝牙按键
      • 3.2.4 完成 Vendor\_568a\_Product\_9869.kl
      • 3.2.5 部署kl文件
  • 四、调试
    • 4.1 成功的情况
    • 4.2 失败的情况
      • 4.2.1 状态显示
      • 4.2.2 开启debug打印
      • 4.2.3 kl 有错误的情况
    • 4.3 如何获取蓝牙按键扫描码?
    • 4.4 蓝牙连接界面

篇头

每隔段时间,总会忘记些东西。在Android上配置红外遥控和蓝牙遥控,是必备技能。之前也写过红外遥控的配置方法,因红外更常遇到。而蓝牙配得少一些,就没意识到更要做总结,以为早就会了,如今配置蓝牙遥控器,一下子居然没配对,经过一番折腾,所以必须记录一下,在此分享给大家。

一、规格书

  • 从规格书中,获取按键布局(取值)情况。
    在这里插入图片描述

二、红外按键配置

  • 配置方法略,此处给出红外的安卓映射值,蓝牙按键的配置,需配置为与红外的安卓按键一致
key 77   BACK
key 26   MENU
key 2   DPAD_CENTER
key 10   DPAD_DOWN
key 67   DPAD_UP
key 78   HOME
key 6   DPAD_LEFT
key 14   DPAD_RIGHT
key 27   VOLUME_UP
key 88   VOLUME_DOWN
key 87   POWER
key 91   VOLUME_MUTE
key 49   SETTINGS
key 53   ZOOM_IN
key 52   ZOOM_OUT
key 255   AUDIO
key 48   TV_INPUT
key 64   APP_SWITCH 

三、蓝牙按键配置

3.1 查看设备号

  • 此处目的是为了获得 vendor=0x568a, product=0x9869,安卓系统默认通过此2项来匹配kl文件
  • version项目可选,一般就不使用了,除了特别需求
  • 提取打印:Identifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001

3.1.1 方式一:dumpsys input

  • 首先使用手动配对,连接上蓝牙遥控器
console:/ # dumpsys input                                                     
INPUT MANAGER (dumpsys input)…… 略 ……Event Hub State:BuiltInKeyboardId: -2Devices:…… 略 ……9: 语音助手 KeyboardClasses: 0x800000a1Path: /dev/input/event8Enabled: trueDescriptor: 64be8d24c5c36a9695b6e91253242e7413e8d0d8Location: ControllerNumber: 0UniqueId: 67:35:d9:5f:90:7bIdentifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: HaveKeyboardLayoutOverlay: falseVideoDevice: <none>

3.1.2 方式二: cat /proc/bus/input/devices

130|console:/ #  cat /proc/bus/input/devices…… 略……
I: Bus=0005 Vendor=568a Product=9869 Version=0001
N: Name="语音助手 Keyboard"
P: Phys=
S: Sysfs=/devices/virtual/misc/uhid/0005:568A:9869.0001/input/input8
U: Uniq=67:35:d9:5f:90:7b
H: Handlers=leds event8 
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff980078 7ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f
…… 略……console:/ #

3.2 配置kl文件

根据vendor=0x568a, product=0x9869,将kl文件命名为Vendor_568a_Product_9869.kl。

3.2.1 方案商原始配置

  • 从3.1.1节的KeyLayoutFile: /system/usr/keylayout/Generic.kl这句打印,以及第一章的遥控器规格书,可以得知方案商的默认配置
  • 遥控器方案商将自己的蓝牙按键映射为标准的蓝牙键盘按键

3.2.2 Generic.kl 文件

  • 此文件是keyboard输入设备的默认keylayout
  • 我们需要从此文件提取键值,也就是kl文件的第2列,这个键值方案商并未给出
举个例子,此处拿出四个按键,请比对遥控器规格书和kl文件key 59    F1   //备注:对应遥控器 Source按键
key 60    F2   //备注:对应遥控器 Settings按键
key 63    F5   //备注:对应遥控器 F+按键
key 64    F6   //备注:对应遥控器 F-按键

3.2.3 重映射蓝牙按键

  • 根据我们的需要,我们把蓝牙按键映射为相同的红外按键的Android键值码,也就是第3列
  • 如SETTINGS,对应到Andoird KeyEvent.java的按键,就是 KEYCODE_SETTINGS
key 59   TV_INPUT //备注:对应遥控器 Source按键
key 60   SETTINGS //备注:对应遥控器 Settings按键
key 63   ZOOM_OUT //备注:对应遥控器 F+按键
key 64   ZOOM_IN  //备注:对应遥控器 F-按键

3.2.4 完成 Vendor_568a_Product_9869.kl

key 158   BACK
key 127   MENU
key 40   DPAD_CENTER
key 152   POWER
key 172   HOME
key 108   DPAD_DOWN
key 103   DPAD_UP
key 105   DPAD_LEFT
key 106   DPAD_RIGHT
key 113   VOLUME_MUTE
key 114   VOLUME_DOWN
key 115   VOLUME_UP
key 60   SETTINGS
key 64   ZOOM_IN
key 63   ZOOM_OUT
key 194   AUDIO
key 59   TV_INPUT
key 186   APP_SWITCH
key 28    DPAD_CENTER

3.2.5 部署kl文件

  • 找到相关的AOSP mk文件及目录,一般就在device/xxxx下面
  • 添加部署语句,将kl部署到/system/usr/keylayout下
  • 其他可选路径,如/vendor/usr/keylayout下 或者 /oem/usr/keylayout下,
PRODUCT_COPY_FILES += \$(LOCAL_MODULE_PATH)/Vendor_568a_Product_9869.kl:$(TARGET_COPY_OUT_SYSTEM)/usr/keylayout/Vendor_568a_Product_9869.kl
  • 编译完成后,可查找确认,配置文件已写对

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、调试

4.1 成功的情况

  • 通过 dumpsys input 命令,可以看到已成功解析到我们所部署的文件
  • KeyLayoutFile: /system/usr/keylayout/Vendor_568a_Product_9869.kl
    9: 语音助手 KeyboardClasses: 0x800000a1Path: /dev/input/event8Enabled: trueDescriptor: 64be8d24c5c36a9695b6e91253242e7413e8d0d8Location: ControllerNumber: 0UniqueId: 67:35:d9:5f:90:7bIdentifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001KeyLayoutFile: /system/usr/keylayout/Vendor_568a_Product_9869.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: HaveKeyboardLayoutOverlay: falseVideoDevice: <none>

4.2 失败的情况

4.2.1 状态显示

  • 通过 dumpsys input 命令,可以看到KeyLayoutFile依旧指向默认的Generic.kl
  • KeyLayoutFile: /system/usr/keylayout/Generic.kl
    9: 语音助手 KeyboardClasses: 0x800000a1Path: /dev/input/event8Enabled: trueDescriptor: 64be8d24c5c36a9695b6e91253242e7413e8d0d8Location: ControllerNumber: 0UniqueId: 67:35:d9:5f:90:7bIdentifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: HaveKeyboardLayoutOverlay: falseVideoDevice: <none>

4.2.2 开启debug打印

  • android\frameworks\native\libs\input\InputDevice.cpp
  • 此文件是匹配probe kl 的关键源文件,在getInputDeviceConfigurationFilePathByName函数中进行解析和匹配kl文件。
  • 开启打印:#define DEBUG_PROBE 1

打印举例:

  • 代表已匹配到
06-18 16:28:38.075  4030  4166 D InputDevice: Probing for system provided input device configuration file: path='/system/usr/keylayout/Vendor_568a_Product_9869.kl'
06-18 16:28:38.076  4030  4166 D InputDevice: Found

4.2.3 kl 有错误的情况

  • kl:16: Expected key code label, got ‘F24’. 代表kl文件里面有个按键配置成了F24,但在按键定义中,找不到F24这个Label的按键
  • 例如在kl中定义:key 194 F24 ,就会有如下错误
06-18 16:38:06.524  4038  4173 D InputDevice: Probe failed to find input device configuration file: name='Vendor_568a_Product_9869_Version_0001', type=1
06-18 16:38:06.524  4038  4173 D InputDevice: Probing for system provided input device configuration file: path='/odm/usr/keylayout/Vendor_568a_Product_9869.kl'
06-18 16:38:06.524  4038  4173 D InputDevice: Probing for system provided input device configuration file: path='/vendor/usr/keylayout/Vendor_568a_Product_9869.kl'
06-18 16:38:06.524  4038  4173 D InputDevice: Probing for system provided input device configuration file: path='/system/usr/keylayout/Vendor_568a_Product_9869.kl'
06-18 16:38:06.525  4038  4173 D InputDevice: Found
06-18 16:38:06.526  4038  4173 E KeyLayoutMap: /system/usr/keylayout/Vendor_568a_Product_9869.kl:16: Expected key code label, got 'F24'.

4.3 如何获取蓝牙按键扫描码?

原本映像,配置蓝牙遥控器的“扫描码”,应该是用0007003a的尾数0x3a,结果却不对,通过一通折腾,和下面的0x003b匹配上了……,姑且都叫扫描码吧。

  • 以第一节的Source按键为例:
  • 方案商定义:信号源按键: Source Key_F1 07003A 30 ,将其映射为F1按键,但其中并没有扫描码
  • 方法:(1)手动连接蓝牙遥控 (2)执行getevent命令 (3)遥控器按下 Source 按键
  • 如下:003b 即为 source按键的蓝牙按键扫描码,转换为十进制为:59 , 值同3.2.2节source按键
console:/ # getevent                                                           
add device 1: /dev/input/event10name:     "语音助手"
add device 2: /dev/input/event9name:     "语音助手 Consumer Control"
add device 3: /dev/input/event8name:     "语音助手 Keyboard"
…… 略 ……/dev/input/event8: 0004 0004 0007003a
/dev/input/event8: 0001 003b 00000001
/dev/input/event8: 0000 0000 00000000
/dev/input/event8: 0004 0004 0007003a
/dev/input/event8: 0001 003b 00000000
/dev/input/event8: 0000 0000 00000000

4.4 蓝牙连接界面

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 智能成绩表(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Docker MySQL Shutting down mysqld

6月初至6月15日发现MySQL无故停机多次&#xff0c;导致系统无法使用。接下来各种日志查看&#xff0c;排查原因。先附上一份Docker种MySQL的日志的截图。 一、根据Docker的日志初步估计是数据库内存飙升&#xff0c;从而被系统杀掉进程 查询Linux系统日志&#xff0c;在宿主机…

安卓Context上下文

目录 前言一、Context简介二、Application Context2.1 Application Context的创建过程2.2 Application Context的获取过程 三、Activity的Context创建过程四、Service的Context创建过程 前言 Context也就是上下文对象&#xff0c;是Android较为常用的类&#xff0c;但是对于Co…

互斥锁,自旋锁和死锁 一文详解,一网打尽

互斥锁&#xff08;Mutex&#xff09;和自旋锁&#xff08;Spinlock&#xff09;是两种常见的用于多线程编程中的同步机制&#xff0c;用于确保在多个线程访问共享资源时的协调性和正确性。以下是它们的主要特点和区别&#xff1a; 互斥锁&#xff08;Mutex&#xff09; 定义…

curl: (56) Recv failure: 连接被对方重设

目录 问题描述&#xff1a; 解决方案&#xff1a; 1.确认端口未被占用 2.检查 Docker 容器端口映射设置 3. 检查防火墙设置 4. 检查 Docker 网络配置 5. 检查 Docker Daemon 配置 6. 检查 SELinux 或 AppArmor 设置 7. 使用 Docker 命令行工具调试 8. 检查网络和路由设…

基于langchain和向量库微调qwen2-1.5B学习行业专属知识

现在有大量的word文档数据需要让大模型学习形成专业业务领域的知识后对外提供问答服务&#xff0c;以下是基于前问Qwen2-1.5B模型进行langchain RAG向量搜索大模型问答的实现过程。 第一步&#xff1a;原始数据处理 原始word文档数据里面包含了封面、目录、概述、专业知识章节…

网络聚合通信测试--自动化测试脚本

一 网络聚合通信测试 以下测试用例为&#xff1a; 整集群测试&#xff0c;每节点进程数从2开始以2的幂次增加至满核心&#xff1b; 测试常见的通信聚合测试8个条目 二 测试前准备 待测节点已完成OS安装及基础配置待测节点已配置完IP&#xff08;若存在IB&#xff0c;则需要配置…

第二十二篇——香农第二定律(一):为什么你的网页总是打不开?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 看似在将知识&#xff0c;实际是在讲生活和所有&#xff1b;突破边界偶尔…

gitlab 获取指定分支下指定路径文件夹的解决方案

第一步&#xff1a; 获取 accessToken 及你的 项目 id &#xff1a; 获取 accessToken ,点击用户头像进入setting 按图示操作&#xff0c;第 3 步 填写你发起请求的域名。 获取项目 id , 简单粗暴方案 进入 你项目仓库页面后 直接 源码搜索 project_id&#xff0c; value 就…

【神经网络】基于CNN(卷积神经网络)构建猫狗分类模型

文章目录 解决问题数据集探索性数据分析数据预处理数据集分割数据预处理 构建模型并训练构建模型训练模型 结果分析与评估模型保存结果预测经验总结 解决问题 针对经典猫狗数据集&#xff0c;基于卷积神经网络&#xff0c;构建猫狗二元分类模型&#xff0c;使用数据集进行参数…

怎么提取视频中的音频?别错过这6个音频提取方法了!(全新)

您是否曾经发现过一个音乐很棒的视频&#xff0c;并想从视频中提取音频&#xff1f;如今&#xff0c;关于提取mp4视频中的音频需求越来越常见。例如&#xff0c;您可能想从mp4格式的电影中提取音频&#xff0c;将音乐用作手机铃声&#xff0c;或在自己的视频项目中使用视频中的…

[Qt] Qt Creator 编码警告:warning:C4819

Qt项目使用VC&#xff08;2019 64bit&#xff09;编译器出现此错误。 warning&#xff1a;C4819&#xff1a;该文件包含不能在当前代码页&#xff08;936&#xff09;中表示的字符。请将该文件保存为Unicode格式以防止数据丢失。(可能这个警告内容也会在Qt Creator 中乱码) 如…

Matlab只选取自己需要的数据画图

在Matlab作图的时候&#xff0c;经常会在同一个坐标系中作很多数据的图&#xff0c;如下图所示&#xff1a; 这就会导致不同数据所作的线会重叠在一起&#xff0c;不利于数据分析。如果只想对比几个数据的趋势&#xff0c;直接修改代码太过麻烦&#xff0c;可通过Matlab的绘图…

【C语言】数组参数和指针参数详解

在写代码的时候难免要把【数组】或者【指针】传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 1 一维数组传参 #include <stdio.h> void test(int arr[])//ok? {} void test(int arr[10])//ok? {} void test(int* arr)//ok? {} void test2(int* arr[20])…

Java毕业设计 基于SSM助学贷款管理系统

Java毕业设计 基于SSM助学贷款管理系统 SSM 助学贷款管理系统 功能介绍 学生&#xff1a;登录 修改密码 学生信息 贷款项目信息 申请贷款 留言信息 公告 学校负责人&#xff1a;登录 修改密码 学生管理 学校负责人信息 贷款项目 贷款申请审批 留言信息 公告 银行负责人&…

Linux中nginx.conf如何配置【搬代码】

Nginx 是一个独立的软件。 它是一款高性能的 Web 服务器、反向代理服务器和负载均衡器等&#xff0c;具有强大的功能和广泛的应用场景。它通常需要单独进行安装和配置来发挥其作用。 下载网址&#xff1a;http://nginx.org/en/download.html nginx.conf写法&#xff1a; #配置…

鸿蒙实现金刚区效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 所谓“金刚区"是位于APP功能入口的导航区域&#xff0c;通常以“图标文字”的宫格导航的形式出现。之所以叫“金刚区”&#xff0c;是因为该区域会随着业务目标的改变&#xff0c;展示不同的功能图标&#xff…

PostgreSQL源码分析——CREATE DATABASE

这里我们分析一下在PostgreSQL中创建数据库的源码&#xff0c;在分析源码之前&#xff0c;最好先阅读《PostgreSQL指南内幕探索》的第一章&#xff0c;数据库集簇、数据库和数据表&#xff0c;弄清其空间布局&#xff0c;理解PG中&#xff0c;数据库、表、元组是怎么布局的。通…

Collections.sort()方法总结

Collections.sort()方法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨 Java 中的 Collections.sort() 方法。这个方法是 Java 集合框架中的…

C# —— 字符串的相关属性和方法

string 属于特殊的引用类型 字符串创建的三种方式 string s "路飞";//自变量定义方式 字符串当中如果要有特殊的符号,使用\进行转义 \t tab \n 换行 \r return键 s "123\rb\tc\nd,想在字符串当中展示引号,需要使用\"进行转义,想输入一个右斜杠\\,想显…