通俗易通讲解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蓝牙键值适配,希望对大家有所帮助。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android适配安卓6.0蓝牙通讯实现过程

    事先说明: 安卓蓝牙需要定位权限申请,在安卓6.0需要用户手动确认权限后才能使用,各位可以自行查询资料实现,如果嫌麻烦,可以用第三方Bmob集成好的工具类进行实现,详细可以看http://blog.csdn.net/qq_30379689/article/details/52223244 蓝牙连接过程: 1.查询用户是否开启蓝牙. 2.搜索附近的可用的蓝牙. 3.进行蓝牙配对. 4.进行蓝牙连接. 5.获取输入流和输出流. 6.发送消息. 晒上我自己画的美图: 实验效果图: 实现需要的权限:由于

  • Android如何实现蓝牙配对连接功能

    目录 本文适用的范围 准备 搜索 配对 连接 坑坑坑 本文适用的范围 Android蓝牙部分是很复杂的,也涉及很多名词和功能.本文介绍的配对连接方法适用于一般的蓝牙耳机.音响等,并不是连接蓝牙 BLE 或者想用蓝牙来进行 Socket 通信的. 先来介绍几种名称: Profile: Bluetooth 的一个很重要特性,就是所有的 Bluetooth 产品都无须实现全部的 Bluetooth 规范.为了更容易的保持 Bluetooth 设备之间的兼容,Bluetooth 规范中定义了 Profi

  • Android获取蓝牙设备列表的方法

    最近换了一家公司,主要内容是做关于移动端室内定位的相关sdk,刚进来的时候信心满满,誓要干出一番天地!!!结果进来快一个多月了,根本没轮到我施展拳脚,给我搁置在一旁自己弄自己的.行吧,既然是做室内定位的话那无非就是(gps,蓝牙,wifi等)这些技术来实现嘛,然后我们就可以有本篇的切入点了: android如何获取蓝牙设备了? 我们一步一步来分析,首先蓝牙属于一种短距离的无线通信技术,那作为我们android系统是否对此有过封装了?答案那肯定是有了! BluetoothAdapter andro

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

    以下图中TV VOD两个按键为例,文章中所涉及到的文件只写文件名,因每个方案的路径各不相同,请自行全局搜索文件.  1.获取按键的扫描码 android设备串口或adb shell下执行getevent -l(小写的L),然后按下按键(以VOD键为例),打印结果如下: getevent显示结果中的三个有效信息: 1)000c006b   前四位000c为键值类型(详情请跳到2与阅读hid.h),后四位为蓝牙键值; 2)KEY_BLUE  如果在linux_key.h中有此按键的定义,此处就会显示

  • Android 蓝牙开发实例解析

    在使用手机时,蓝牙通信给我们带来很多方便.那么在Android手机中怎样进行蓝牙开发呢?本文以实例的方式讲解Android蓝牙开发的知识.        1.使用蓝牙的响应权限 XML/HTML代码 <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN&qu

  • Android中Spinner控件之键值对用法实例分析

    本文实例讲述了Android中Spinner控件之键值对用法.分享给大家供大家参考.具体如下: 一.字典表,用来存放键值对信息 package com.ljq.activity; import java.io.Serializable; @SuppressWarnings("serial") public class Dict implements Serializable { private Integer id; private String text; public Dict()

  • Android中Property模块的键值设置

    Android中Property模块的键值设置 Prop模块是保存少量的全局共享信息,其保存的数据具有信息量少,跨进程共享数据等特性:每一条信息包含两个属性,键名和键名对应的键值,例如: ro.product.locale.language=en "Ro.product.locale.language"表示本产品本地语言,表示该条信息的名字,"en"表示该条信息的取值为英文,这样任何一个应用程序就知道本机使用的语言情况.在接口设计时也需要有两个参数,name和val

  • Python 3.x 判断 dict 是否包含某键值的实例讲解

    查询资料得 Python 可以使用两种方式判断字典是否包含某键值 1.(dict.has_key('keyname')) 2.('keyname' in dict) 觉得第二种方式太过丑陋,所以想用第一个函数,但是pycharm一直报错 查询官方资料得: Python 3.x不再支持 has_key() 函数,而被__contains('keyname')所替代 以上这篇Python 3.x 判断 dict 是否包含某键值的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家

  • php二维数组按某个键值排序的实例讲解

    排序前 Array ( [0] => Array ( [name] => 龙 [age] => 2017-02-28 ) [1] => Array ( [name] => 龙2 [age] => 2017-03-14 ) [2] => Array ( [name] => 小3 [age] => 2017-05-09 ) [3] => Array ( [name] => 龙4 [age] => 2017-02-03 ) [4] =>

  • Android 蓝牙BLE开发完全指南

    目录  介绍 连接模式 GATT协议 使用过程 扫描 连接 设备连接 发现服务 数据传输 其他 断开连接 参考 总结  介绍 1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙.由蓝牙技术联盟(Bluetooth SIG)设计的无线通讯技术,主要用于医疗,健身,安全和家庭娱乐行业. 与传统蓝牙相比,蓝牙低功耗旨在大幅降低功耗和成本,同时也能够达到相同的通讯效果. 支持多个平台,包括 IOS,Android,Windows Phone 和 BlackBerry 以及

  • Android蓝牙库FastBle的基础入门使用

    前言 最近在做物联网课设,过程中需要用到Android的蓝牙API,奈何原生的蓝牙API使用有点麻烦.于是上网搜索看有没有好用的Android蓝牙库,然后发现了这个宝贝,给大家分享一下. FastBle VS 原生Android蓝牙API 原生Android的蓝牙API使用有点麻烦,要先获取设备的蓝牙适配器,接着注册广播来接受蓝牙设备信息,用完了还需要将广播给注销,相对来说有点麻烦. 不好封装,可以说是原生Android最让人痛苦的地方,这是因为原生Android的代码不是很独立,与Activi

  • Android蓝牙聊天开源项目

    前言 基于Android Classic Bluetooth的蓝牙聊天软件,目前仅支持一对一实时通信.文件传输.好友添加.好友分组.好友在线状态更新等功能,其中消息发送支持文本.表情等方式. 项目地址:Android蓝牙聊天项目 前景 蓝牙技术作为一种小范围无线连接技术,能够在设备间实现方便快捷.灵活安全.低成本.低功耗的数据和语音通信,是目前实现无线个人局域网的主流技术之一.同时,蓝牙系统以自组式组网的方式工作,每个蓝牙设备都可以在网络中实现路由选择的功能,可以形成移动自组网络.蓝牙的特性在许

  • python 实现二维字典的键值合并等函数

    这篇文章主要讲python中关于字典的一些具体操作,讲解的问题都是本人在实际编程中所遇到的问题,读者可以根据自己所遇到的问题具体问题具体分析. (1) 二维字典的键值合并: 先提供一个应用场景: 假设我有两个二维字典: room1 = {orderid1:{roomid1:pred1,roomid2:pred2},orderid2:{roomid3:pred3,roomid4:pred4}} room2 = {orderid1:{roomid1:pred5,roomid2:pred6},orde

随机推荐