通俗易通讲解Android蓝牙键值适配

 更新时间:2021年12月03日 08:57:38   作者:peak wang  
这篇文章介绍了Android蓝牙键值适配的方法,对大家的学习或工作具有一定的参考借鉴价值。需要的朋友可以收藏下,方便下次浏览观看

以下图中TV VOD两个按键为例,文章中所涉及到的文件只写文件名,因每个方案的路径各不相同,请自行全局搜索文件。

 1.获取按键的扫描码

android设备串口或adb shell下执行getevent -l(小写的L),然后按下按键(以VOD键为例),打印结果如下:

getevent显示结果中的三个有效信息:

  • 1)000c006b   前四位000c为键值类型(详情请跳到2与阅读hid.h),后四位为蓝牙键值;
  • 2)KEY_BLUE  如果在linux_key.h中有此按键的定义,此处就会显示,如果linux_key.h中没有对此键的定义就会显示KEY_UNKNOWN.
  • 3)/dev/input/event4: 设备节点,可以通过dumpsys input命令查看此节点使用KeyLayoutFile(即映射键值的.kl的文件)
console:/ # getevent -l                                                        
add device 1: /dev/input/event4
  name:     "语音助手"
could not get driver version for /dev/input/mouse2, Not a typewriter
add device 2: /dev/input/event3
  name:     "Hi Keypad"
could not get driver version for /dev/input/mouse1, Not a typewriter
add device 3: /dev/input/event1
  name:     "Hi mouse"
could not get driver version for /dev/input/mice, Not a typewriter
add device 4: /dev/input/event0
  name:     "Hi keyboard"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 5: /dev/input/event2
  name:     "qwerty"
/dev/input/event4: EV_MSC       MSC_SCAN             000c006b            
/dev/input/event4: EV_KEY       KEY_BLUE             DOWN                
/dev/input/event4: EV_SYN       SYN_REPORT           00000000            
/dev/input/event4: EV_MSC       MSC_SCAN             000c006b            
/dev/input/event4: EV_KEY       KEY_BLUE             UP                  
/dev/input/event4: EV_SYN       SYN_REPORT           00000000    

2.hid-input.c

从getevent -l时已知VOD按键为000c006b,前四位详细定义可以参考kernel下的hid.h,此处只列举几个:

#define HID_UP_KEYBOARD         0x00070000
#define HID_UP_LED              0x00080000
#define HID_UP_BUTTON           0x00090000
#define HID_UP_ORDINAL          0x000a0000
#define HID_UP_TELEPHONY        0x000b0000
#define HID_UP_CONSUMER         0x000c0000

在hid-input.c中有个函数hidinput_configure_usage,会根据不同的hid执行不同的代码,为0007(HID_UP_KEYBOARD)时会处理hid_keyboard[256]的数组,把扫描码转换为10进制后就是该数组的下标,数组下标的数组元素就是linux键值,我的键值前面是000c所以跳过前面说的,case走的是HID_UP_CONSUMER,此case下已有对0x6b的处理,意思就是此键在linux中代表的是KEY_BLUE。

static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
				     struct hid_usage *usage)
{
 
	/**省略**/
	switch (usage->hid & HID_USAGE_PAGE) {
	case HID_UP_UNDEFINED:
		goto ignore;
    /**省略**/
    /**省略**/
	case HID_UP_KEYBOARD:
		set_bit(EV_REP, input->evbit);
 
		if ((usage->hid & HID_USAGE) < 256) {
			if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
			map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
		} else
			map_key(KEY_UNKNOWN);
 
		break;
    
 
	case HID_UP_CONSUMER:	/* USB HUT v1.12, pages 75-84 */
		switch (usage->hid & HID_USAGE) {
		case 0x06a: map_key_clear(KEY_GREEN);		break;
		case 0x06b: map_key_clear(KEY_BLUE);		break;
		case 0x06c: map_key_clear(KEY_YELLOW);		break;
		case 0x06d: map_key_clear(KEY_ZOOM);		break;
 
    /**省略**/
    /**省略**/
}

那KEY_BLUE的键值是多少呢?

{"KEY_BLUE", 0x191},

我们来查阅linux_key.h,搜索KEY_BLUE,我的sdk中KEY_BLUE的值为0x191,转换为十进制值为401。

3.KeyLayoutFile  --> .kl

getevent -l时已知设备节点为/dev/input/event4,那我们执行下dumpsys input,结果如下:

5: 语音助手
      Classes: 0x8000012b
      Path: /dev/input/event4
      Enabled: true
      Descriptor: e0cab5a5e7db45d100777208b12fb1c21978adca
      Location: 
      ControllerNumber: 0
      UniqueId: 18:11:18:24:33:18
      Identifier: bus=0x0005, vendor=0x2b54, product=0x1600, version=0x0101
      KeyLayoutFile: /vendor/usr/keylayout/Vendor_2b54_Product_1600.kl
      KeyCharacterMapFile: /vendor/usr/keychars/Generic.kcm
      ConfigurationFile: 
      HaveKeyboardLayoutOverlay: false

结果中可以看出我的蓝牙遥控器的vendor=2b54,product=1600,所以系统优先加载的我自己加到ROM中的kl(.kl命名规则与加载优先级请自行百度),有的可能找不到,会加载Generic.kl等文件,请根据KeyLayoutFile:后的路径的文件修改映射关系,如果为默认的Generic.kl时,建议不要修改此文件,可以根据vendor与product规则自己新建一个文件。

那我们打开指向的这个kl文件,内容如下:

#key 222 "KEY_RED"                                                                                                
# key 400 "KEY_YELLOW"                                                    
key 401 PROG_GREEN                                                              
key 402   CHANNEL_UP
key 403   CHANNEL_DOWN

kl文件格式简单解析(详解与其它使用方法自行搜索):

key 可以理解成固定格式 

222/401等数字对应的就是linux的键值

PROG_GREEN 这里对应的就是Android层的键值(此字符串要与InputEventLabels.h中的保持一致,否则会报Expected key code label异常,然后就加载其它默认的kl文件了,5.0以前是KeycodeLabels.h或KeyCodeLabels.h)

既然都理清楚了,那处理按键岂不是很简单了?

已知前面linux_key.h中查询VOD的linux键值为401,如果你想让此按键生效,把前面的#号去掉重启设备,使其映射关系生效即可,如果你想改变键值的功能,可以直接在此kl中把401对应的android层的KEY_BLUE改为你想要的键就可以了。(当然也可以修改linux的键值,但不提倡这么做.)

总结:

  • 1.通过getevent -l获取键值设备节点;
  • 2.hid-input.c中添加或修改你的键值;
  • 3.通过设备节点找到对应的kl文件;
  • 4.添加或修改映射关系;

以上所述是小编给大家介绍的Android蓝牙键值适配,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android tabLayout+recyclerView实现锚点定位的示例

    Android tabLayout+recyclerView实现锚点定位的示例

    这篇文章主要介绍了Android tabLayout+recyclerView实现锚点定位的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Android自定义超级炫酷的ViewPage指示器

    Android自定义超级炫酷的ViewPage指示器

    由于应公司开发要求,有一个颜色渐变带缩放的指示器,虽然网上很多大佬开源的指示器开源库,但如果一直都是使用别人造的轮子,那么对于自身的能力是毫无提升作用的,即使是参考别人的,然后自己动手写一遍那对于自身来说也是一种升华
    2022-07-07
  • 完美解决EditText和ScrollView的滚动冲突(下)

    完美解决EditText和ScrollView的滚动冲突(下)

    这篇文章再次为大家详细介绍了完美解决EditText和ScrollView滚动冲突的方法,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android编程图片加载类ImageLoader定义与用法实例分析

    Android编程图片加载类ImageLoader定义与用法实例分析

    这篇文章主要介绍了Android编程图片加载类ImageLoader定义与用法,结合实例形式分析了Android图片加载类ImageLoader的功能、定义、使用方法及相关操作注意事项,代码中备有较为详尽的注释便于理解,需要的朋友可以参考下
    2017-12-12
  • Android结合kotlin使用coroutine的方法实例

    Android结合kotlin使用coroutine的方法实例

    这篇文章主要给大家介绍了关于Android结合kotlin使用coroutine的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Fragment通过FragmentManager实现通信功能详细讲解

    Fragment通过FragmentManager实现通信功能详细讲解

    这篇文章主要介绍了Fragment通过FragmentManager实现通信功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Android实现微信聊天语言点击喇叭动画效果

    Android实现微信聊天语言点击喇叭动画效果

    这篇文章主要为大家详细介绍了Android实现微信聊天语言点击喇叭动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android开发实现的几何图形工具类GeometryUtil完整实例

    Android开发实现的几何图形工具类GeometryUtil完整实例

    这篇文章主要介绍了Android开发实现的几何图形工具类GeometryUtil,涉及Android坐标图形数值运算相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Flutter WebView 预加载实现方法(Http Server)

    Flutter WebView 预加载实现方法(Http Server)

    这篇文章主要介绍了Flutter WebView 预加载实现方法,包括资源的配置,资源的下载和存储,版本的管理,如何根据实际url获取对应HttpServer bind的url等,需要的朋友可以参考下
    2022-05-05
  • 浅谈Android Studio 3.0 的一些小变化

    浅谈Android Studio 3.0 的一些小变化

    本篇文章主要介绍了浅谈Android Studio 3.0 的一些小变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论