遥控器键值适配
一般来说,遥控器分蓝牙遥控器和红外遥控器。红外遥控器是指遥控器通过红外发射器把信号进行发射,接收设备则通过红外接收器进行信号接收;蓝牙遥控器是指遥控器通过蓝牙方式进行交互,遥控器和被连接设备均支持蓝牙则可以进行蓝牙操作。
每个遥控器的每个按键都有独特的物理码,这是遥控器出厂时就已经具备的,而且不同的遥控器厂商也有单独的用户码。我们通过已知的条件,需要在SDK里做出相应的适配和映射。
-
遥控器红外键值没定义
1.第一步:要知道这个遥控器的按键对应的scancode码是什么?有两种方式可以知道这个scancode没定义的值是什么。一、使用命令dmesg -c;二、使用echo 8 > /proc/sys/kernel/printk;这两种方式都可以查询到遥控器某个按键没定义的物理码。以下我用音量键减没定义为例。
通过使用dmesg -c查询如下:
如上图所示,很明显可以看到音量键减没定义的物理码是154,这个是十进制的数值,需要转换为十六进制,转换之后为9A,这个值先保留记住,之后适配时需要用上。2.第二步:需要知道遥控器的用户码,每款遥控器都有独特的用户码,就好像每个人都有自己的身份证一样,用户码就是遥控器身份证。使用cat /sys/devices/virtual/remote/amremote/customcode命令进行查看遥控器用户码,在串口执行该命令后,按下遥控器的任意键,再次执行该命令就可以看到你使用这款遥控器的用户码了。
3.第三步:进行定义。需要定义该用户码相关的remote配置文件,该文件是主要映射物理码和安卓键码的,是联系底层和上层的一个枢纽文件。知道了用户码和物理码即可开始配置remote配置文件,配置内容如下:
// remote配置文件 custom_name = test-remote-1 custom_code = 0xc43b release_delay = 80 key_begin 0x9a 114 #VOLUME_DOWN key_end
此时使用getevent命令,再按压音量键减,则会有相应的输出,如下:
但此时音量键的功能还没能正常使用,需要把remote文件和kl文件关联起来。4.第四步:需要知道遥控器对应的kl是哪个,需要知道遥控器的pid和vid是什么?也可以知道目前遥控器使用的是哪个kl文件?从上面步骤可得知,目前遥控器使用的event是/dev/input/event1,可以使用getevent -v来得知/dev/input/event1对应的是哪个pid和vid,使用getevent -v得出结果如下:
红色框住的就是pid和vid,我们可以通过pid和vid直接配置kl文件,放置文件到指定目录下。可以使用dumpsys input命令查询到目前/dev/input/event1对应的kl文件,如下:
目前知道了kl文件,文件名字也和pid、vid对应,则无须新建,直接通过vi修改文件,把音量键减的逻辑添加进去,刚才在remote文件中定义0x9a对应的是114,所以在kl文件里面则是通过114这个id来做标识,在kl文件里面添加逻辑如下:key 114 VOLUME_DOWN
此时音量键减功能已生效,肯定还有看官会很疑惑为什么音量键减功能就会生效了,其实关键就在VOLUME_DOWN这个值里,这个不是随便写的,是有底层文件与之相对应的。
5.第五步:要查找KeyEvent.java文件相关定义,路径为frameworks/base/core/java/android/view/,查看到相关代码如下:
/** Key code constant: Volume Down key. * Adjusts the speaker volume down. */ public static final int KEYCODE_VOLUME_DOWN = 25;
数值25则是映射成最上层的安卓键值,可通过命令logcat -s WindowManager进行查询,按压音量键减,logcat -s WindowManager结果输出如下:
按下和弹起则是一个轮回,可以看到输出结果就是25,和KeyEvent.java文件里面的值对应了起来。
重点:一般定义的键值涉及三个文件(attrs.xml、keycodes.h、InputEventLabels.h),在这三个文件里都会得到音量键减的相关的一些逻辑,如下://路径为:frameworks/base/core/res/res/values/attrs.xml <enum name="KEYCODE_VOLUME_DOWN" value="25" />
//路径为:frameworks/native/include/android/keycodes.h /** Volume Down key. * Adjusts the speaker volume down. */ AKEYCODE_VOLUME_DOWN = 25,
//路径为:frameworks/native/include/input/InputEventLabels.h DEFINE_KEYCODE(VOLUME_DOWN),
之后需要自定义键值在该四个文件里进行定义即可。
小知识:可在hotkey.properties文件下配置热键,一般预置在设备的/system/etc目录下。
至此,红外遥控器的键值简单适配和定义讲诉完毕,下面讲蓝牙遥控器的键值适配和定义。 -
遥控器蓝牙键值没定义
1.第一步:通过蓝牙连接好蓝牙遥控器和设备。
2.第二步:需要知道没定义遥控器的蓝牙HID键码值Usage ID,如果是自定义的Usage ID,一般需要遥控器厂商提供,一般是根据规范定义出来的。我以蓝牙遥控器#键为例,目前蓝牙遥控器#键没有效果,通过getevent命令也没有任何输出,通过查询可知#键的Usage ID为0x304,这个需要记住,下面适配需要用上。
小知识:HID键码值不止Usage ID,还有Usage Page,Usage Page一般为0x07和0x0C两个数值,0x07代表已经定义好的键码,0x0C代表用户自定义的键码。
3.第三步:适配HID键值,首先需要修改hid-input.c,这个文件先用Usage ID和input.h先关联起来,用户自定义的键值一般需要修改hid-input.c中hidinput_configure_usage方法,然后找到方法里的HID_UP_CONSUMER里面进行添加,代码添加如下://common/drivers/hid/hid-input.c case 0x304: map_key_clear(KEY_POUND); break;
input.h文件也须添加相关代码,input.h里面对应的值,到时候getevent也会输出对应的值,添加代码如下:
//common/include/uapi/linux/input.h #define KEY_POUND 0x2f1
注意:在input.h里面也可知道定义的最大值不能超过0x2ff,不然溢出则定义失败。
小知识:0x07的HID键码表如下:static const unsigned char hid_keyboard[256] = { 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106, 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190, 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113, 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk, 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk, 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk };
4.第四步:getevent有值并且知道值为0x2f1,需要转换为十进制为753,需要到对应kl文件里进行相关配置,通过getevent -v得知蓝牙遥控器的pid和vid,如下:
所以通过pid和vid配置相关kl即可。使用dumpsys input知道目前使用的kl是默认的,如下:
通过pid和vid配置kl,名称为Vendor_0508_Product_0110.kl,配置后和内容如下:///system/usr/keylayout/Vendor_0508_Product_0110.kl key 753 POUND
至此,蓝牙键值定义完成。文章来源:https://www.toymoban.com/news/detail-447308.html
由上,红外遥控器和蓝牙遥控器的键值定义和适配完成了,有疑问联系。文章来源地址https://www.toymoban.com/news/detail-447308.html
到了这里,关于电视红外/蓝牙遥控器键值定义和适配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!