Android 配置蓝牙遥控器键值

文章目录

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

篇头

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

一、规格书

  • 从规格书中,获取按键布局(取值)情况。

二、红外按键配置

  • 配置方法略,此处给出红外的安卓映射值,蓝牙按键的配置,需配置为与红外的安卓按键一致
Plain 复制代码
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

  • 首先使用手动配对,连接上蓝牙遥控器
Plain 复制代码
console:/ # dumpsys input                                                     
INPUT MANAGER (dumpsys input)
 ...... 略 ......

Event Hub State:
  BuiltInKeyboardId: -2
  Devices:
 ...... 略 ......
    9: 语音助手 Keyboard
      Classes: 0x800000a1
      Path: /dev/input/event8
      Enabled: true
      Descriptor: 64be8d24c5c36a9695b6e91253242e7413e8d0d8
      Location: 
      ControllerNumber: 0
      UniqueId: 67:35:d9:5f:90:7b
      Identifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001
      KeyLayoutFile: /system/usr/keylayout/Generic.kl
      KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
      ConfigurationFile: 
      HaveKeyboardLayoutOverlay: false
      VideoDevice: <none>

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

Plain 复制代码
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列,这个键值方案商并未给出
Plain 复制代码
举个例子,此处拿出四个按键,请比对遥控器规格书和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
Plain 复制代码
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

Plain 复制代码
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下,
Plain 复制代码
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
Plain 复制代码
    9: 语音助手 Keyboard
      Classes: 0x800000a1
      Path: /dev/input/event8
      Enabled: true
      Descriptor: 64be8d24c5c36a9695b6e91253242e7413e8d0d8
      Location: 
      ControllerNumber: 0
      UniqueId: 67:35:d9:5f:90:7b
      Identifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001
      KeyLayoutFile: /system/usr/keylayout/Vendor_568a_Product_9869.kl
      KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
      ConfigurationFile: 
      HaveKeyboardLayoutOverlay: false
      VideoDevice: <none>

4.2 失败的情况

4.2.1 状态显示

  • 通过 dumpsys input 命令,可以看到KeyLayoutFile依旧指向默认的Generic.kl
  • KeyLayoutFile: /system/usr/keylayout/Generic.kl
Plain 复制代码
    9: 语音助手 Keyboard
      Classes: 0x800000a1
      Path: /dev/input/event8
      Enabled: true
      Descriptor: 64be8d24c5c36a9695b6e91253242e7413e8d0d8
      Location: 
      ControllerNumber: 0
      UniqueId: 67:35:d9:5f:90:7b
      Identifier: bus=0x0005, vendor=0x568a, product=0x9869, version=0x0001
      KeyLayoutFile: /system/usr/keylayout/Generic.kl
      KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
      ConfigurationFile: 
      HaveKeyboardLayoutOverlay: false
      VideoDevice: <none>

4.2.2 开启debug打印

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

打印举例:

  • 代表已匹配到
Plain 复制代码
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 ,就会有如下错误
Plain 复制代码
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按键
Plain 复制代码
console:/ # getevent                                                           
add device 1: /dev/input/event10
  name:     "语音助手"
add device 2: /dev/input/event9
  name:     "语音助手 Consumer Control"
add device 3: /dev/input/event8
  name:     "语音助手 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 蓝牙连接界面

相关推荐
冬奇Lab28 分钟前
ANR实战分析:一次audioserver死锁引发的系统级故障排查
android·性能优化·debug
冬奇Lab33 分钟前
Android车机卡顿案例剖析:从Binder耗尽到单例缺失的深度排查
android·性能优化·debug
ZHANG13HAO1 小时前
调用脚本实现 App 自动升级(无需无感、允许进程中断)
android
圆号本昊2 小时前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑3 小时前
MySQL的TRIM函数
android·数据库·mysql
mrsyf4 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者4 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql
liang_jy6 小时前
Android 事件分发机制(一)—— 全流程源码解析
android·面试·源码
峥嵘life7 小时前
2026 Android EDLA 认证相关资源网址汇总(持续更新)
android·java·学习
kkk_皮蛋7 小时前
在移动端使用 WebRTC (Android/iOS)
android·ios·webrtc