Android 配置蓝牙遥控器键值

news2024/7/6 17:46:39

文章目录

  • 篇头
  • 一、规格书
  • 二、红外按键配置
  • 三、蓝牙按键配置
    • 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: -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 蓝牙连接界面

在这里插入图片描述

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

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

相关文章

Boosting原理代码实现

1&#xff0e;提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中&#xff0c;提升方法通过反复修改训练数据的权值分布&#xff0c;构建一系列基本分类器&#xff08;弱分类器&#xff09;&#xff0c;并将这些基本分类器线性组合&#xff0c;构成一个强分类…

git提交遇见的<<<<<<<< HEAD无法运行程序问题

在项目文件目录下打开git bash Here 在命令行中输入 git reset --hard HEAD~1 进行复原 git reset --hard HEAD~1 即可

基于Java + Swing + MySQL的学生选课及成绩管理系统(Java课程设计)

目录 开发工具系统结构功能展示登录与注册界面&#xff08;通用&#xff09;主界面&#xff08;通用&#xff09;学生信息查询界面&#xff08;学生用户&#xff09;学生信息管理界面&#xff08;教师用户 管理员用户&#xff09;学生选课界面&#xff08;学生用户&#xff09;…

跟TED演讲学英文:A tale of mental illness -- from the inside by Elyn Saks

A tale of mental illness – from the inside Link: https://www.ted.com/talks/elyn_saks_a_tale_of_mental_illness_from_the_inside Speaker: Elyn Saks Date: June 2012 文章目录 A tale of mental illness -- from the insideIntroductionVocabularySummaryTranscriptA…

【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])…

爬虫可以做什么?Python爬虫入门必看保姆级教程!(学习资源+学习路线)

一、什么是爬虫&#xff1f; Python爬虫&#xff0c;也称为Python网络爬虫或网页蜘蛛&#xff0c;是一种使用Python编程语言编写的程序&#xff0c;用于自动地抓取互联网上的信息。这种程序按照预设的规则&#xff0c;模拟浏览器请求站点的行为&#xff0c;从网站上抓取数据并…

【长春理工大学主办 | EI检索稳定 | SPIE出版 | 过往4届均检索 】第五届计算机视觉和数据挖掘国际学术会议(ICCVDM 2024)

第五届计算机视觉和数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09; 2024 5th International Conference on Computer Vision and Data Mining 会议简介 第五届计算机视觉与数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09;将于2024年7月19-21日在中国长春…

中国剩余定理——AcWing 204. 表达整数的奇怪方式

中国剩余定理 定义 中国剩余定理最早出自我国古代的《孙子算经》&#xff0c;是数论中的一个重要定理。它描述了这样一种情况&#xff1a;在模运算下&#xff0c;对于一组线性同余方程组&#xff0c;存在唯一解的条件和求解方法。 运用情况 常用于在一些涉及到按不同模的余…

ROS std_msgs消息包

ROS std_msgs消息包 基本概述 std_msgs 是 ROS&#xff08;Robot Operating System&#xff09;的一个核心消息包&#xff0c;包含了一系列基本的消息类型&#xff0c;这些类型用于节点之间的标准通信。std_msgs 中的消息类型设计得非常简单&#xff0c;以便用作更复杂消息的…

IO读取properties文件实现JDBC连接池实战

参考文章 Java中的池化思想 面试官&#xff1a;为什么数据库连接很消耗资源&#xff0c;资源都消耗在哪里&#xff1f; 池化思想是什么&#xff1f;连接池是什么&#xff1f; 在Java中&#xff0c;池化思想是一种通过创建和管理可重复使用的对象池来提高性能和资源利用率的编…

GitHub星标破千Star!Python游戏编程的初学者指南

Python 是一种高级程序设计语言&#xff0c;因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种&#xff0c;与其说是教编程的书&#xff0c;倒不如说是在教“游戏制作软件”&#xff0c;或教授使用一种呆板的语言&#x…

深入解析纹理贴图——纹理压缩技术

by STANCH 标签&#xff1a;#纹理压缩 #纹理贴图 1.纹理压缩概述 3D计算机图形学离不开各种类型的纹理。纹理贴图可以极大地提高3D物体的视觉质量和细节水平,而不增加几何复杂度。简单的纹理是二维图像&#xff0c;该图像的单个像素称为纹素(texel)。事实上,纹理不仅可以存储…

CMDB是什么实践案例分享

CMDB是什么&实践案例分享 腾讯蓝鲸CMDB通过集中化管理、自动化发现、灵活的模型定义和开放的API&#xff0c;帮助企业高效管理IT资产和配置项&#xff0c;提升运维效率和服务质量&#xff0c;同时支持与其他系统的无缝集成&#xff0c;适用于金融、制造、互联网等多个行业…

Airflow Dag中,某个多分支汇合的task不执行

之前才接触airflow的时候遇到这个问题&#xff0c;但是解决了没有记录&#xff0c;今天又遇到了想起来就记录下 就拿这个图举例&#xff0c;这是个典型的分支路最后汇合执行的task&#xff0c;用代码演示就是这种情况&#xff0c;有两条路可以执行&#xff0c;最后又回归同一个…

工业边缘计算网关在机械制造企业中的应用-天拓四方

随着信息技术的不断发展&#xff0c;工业领域对数据处理和分析的需求日益增长。工业边缘计算网关作为一种新型技术&#xff0c;正逐渐成为工业数字化转型的关键驱动力。本文将通过一个具体案例阐述工业边缘计算网关在工业中的应用&#xff0c;以及其为工业生产带来的显著效益。…

集体爆雷!突发中科院2区(Top) 被标记!新增10本期刊被“On Hold“

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

如何在宝塔中使用命令行执行命令

一、 进入宝塔&#xff0c;找到网站然后点击根目录 二、进入项目中&#xff0c;然后点击 终端 三、如果这里会弹出输入密码的框&#xff0c;那就是需要你输入一下你服务器的 账号密码&#xff0c;然后就登录进去了&#xff0c;可以在这里直接执行命令即可&#xff0c;比如我这…

Notes客户机开启事务日志

大家好&#xff0c;才是真的好。 了解过事务日志的人都知道——等等&#xff0c;你还不知道事务日志&#xff1f; 那我们先介绍一下&#xff0c;简单来说&#xff0c;Domino事务日志是捕获数据库更改并将其写入的记录&#xff0c;然后等服务器不繁忙或按计划更新到磁盘上的No…

【前端:HTML+CSS+JavaScript】HTML基础(下)

一、表格标签 1.1 表格的主要作用 表格主要用于显示、展示数据。因为她可以让数据显示的非常频繁&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就线程显得很重要。表格不是用来布局页面的。而是用来展示数据的。 1.2 表格的基本语法 <…

了解Nest.js

一直做前端开发&#xff0c;都会有成为全栈工程师的想法&#xff0c;而 Nest 就是一个很好的途径&#xff0c;它是 Node 最流行的企业级开发框架&#xff0c;提供了 IOC、AOP、微服务等架构特性。接下来就让我们一起来学习Nest.js Nest.js官网地址 一&#xff0c;了解Nest Cli …