首页 > 其他分享 >Android 配置蓝牙遥控器键值

Android 配置蓝牙遥控器键值

时间:2024-06-18 21:03:18浏览次数:11  
标签:蓝牙 kl 遥控器 键值 usr key 按键 input Android

文章目录

篇头

每隔段时间,总会忘记些东西。在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: -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

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: 语音助手 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
    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

打印举例:

  • 代表已匹配到
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/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 蓝牙连接界面

在这里插入图片描述

标签:蓝牙,kl,遥控器,键值,usr,key,按键,input,Android
From: https://blog.csdn.net/yyzsyx/article/details/139782430

相关文章

  • android studio manifest结构关系
    <manifest><uses-permission/><permission/><permission-tree/><permission-group/><instrumentation/><uses-sdk/><uses-configuration/><uses-feature/>&......
  • 53.收官 Android四大组件之一服务
    服务一个长期运行在后台的用户组件不依赖于Activity只有当系统必须回收内存资源时才会被销毁首先是创建服务当写好后会自动在清单文件中注册服务的生命周期和启动方式先简单介绍一下然后用两个小案例来日志打印验证第一种启动方式startService()启动服务的组......
  • 52.Android四大名捕之一...四大组件之一广播
    广播(Broadcast)啥叫广播例如:电池电量低的时候会提醒电量不足这就是广播广播即在组件之间传递消息的机制Binder机制Binder机制作为Android系统中非常重要的一部分,为不同进程之间的数据共享和通信提供了高效、稳定的解决方案。开发者在Android开发中,可以通过Android提供的Bi......
  • Android 11 禁止从SD卡上安装第三方应用
    找到负责安装app的类:./frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java修改日志变量,打印日志,顺着日志看流程:publicstaticfinalbooleanDEBUG_INSTALL=true;05-2809:12:12.46241234184IPackageManager:init_copy:Install......
  • 谈一谈Android系统和iOS系统的点击实现复制功能
    序言:   谈到复制功能,想必大多数人都使用的navigator.clipboard.writeText()来实现对文本的复制。但是这个方法却只能在Android系统中成功复制到剪切板,在iOS系统中却不行,下面就谈谈iOS系统中的问题和实现方法。问题描述:iOS对用户数据和设备功能的访问有着严格的控制,尤其是......
  • Android 屏幕适配
    目录一、目的二、环境三、相关概念3.1屏幕尺寸(screensize)3.2屏幕分辨率(Resolution)3.3像素(pixel)3.4ppi3.5dpi3.6dp/dip3.7sp四、Q&A4.1为啥dpi=160?4.2为啥Android要引入dp概念?五、代码仓库地址六、参考资料一、目的        最近在调试一款设备,发现视......
  • Android Studio 插件分享——Gradle Utilities
    插件地址GradleUtilities这个插件可以用来管理Gradle相关的文件,同时用来升级Gradle这个插件提供了一些有用的实用程序来支持Gradle的日常工作:列出所有正在运行的Gradle守护进程及其状态。此外,还可以执行终止守护程序或查看其命令行的操作。管理Gradle主页:清除......
  • Android Studio 插件分享——Gradle Utilities
    插件地址GradleUtilities这个插件可以用来管理Gradle相关的文件,同时用来升级Gradle这个插件提供了一些有用的实用程序来支持Gradle的日常工作:列出所有正在运行的Gradle守护进程及其状态。此外,还可以执行终止守护程序或查看其命令行的操作。管理Gradle主页:清除......
  • android ConcurrentModificationException 错误
    错误代码valsubList=newList.subList(position,endPosition+1)valmergeList:MutableList<IChatTab>=mutableListOf()//展开文件里面的tab,放到一个folder里面valtabIterator:Iterator<IChatTab>=subList.iterator()whi......
  • Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合
    Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合和哈希表。以下是一些Redis命令的实践示例,帮助你了解如何使用Redis。连接Redis服务器首先,使用redis-cli命令连接到Redis服务器:redis-cli-h<hostname>-p<port>基本命令PING:检查Redis......