1,可以通过第三方apk 读取键值上报是否正确,简单测试程序如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/input.h>
#define KEY_DEV "/dev/input/event2"
static int ts_fd = -1;
static struct input_event data;
static int init_device(char *TS_DEV)
{
if((ts_fd = open(TS_DEV, O_RDONLY)) < 0)
{
printf("Error open %s\n\n", TS_DEV);
return -1;
}
return ts_fd;
}
static int test_key()
{
if(init_device(KEY_DEV) < 0)
return -1;
printf("waiting for key......\n");
while(1)
{
read(ts_fd, &data, sizeof(data));
if (data.type == EV_KEY)
printf("type: EV_KEY, event = %d, value = %d\n",data.code, data.value);
}
return 0;
}
int main()
{
test_key();
return 0;
}
2 键值映射
根据Android官方教程Key Layout Files分析它会优先读取/system/usr/keylayout/DEVICE_NAME.kl按键映射文件。而设备上的物理按键的设备名正好是「rk29-keypad」,可以通过getevent查看出来。
这也解释了20140315添加红外遥控器的键值时不能添加到rk29-keypad.kl中,而添加到Generic.kl可以正常。因为Generic.kl的属于fallback级别的映射文件。针对遥控器正确的方法同样新建立一个DEVICE_NAME.kl的映射文件。比如遥控器设备名为rkxx-remotectl那么新建一个rkxx-remotectl.kl映射文件,内容是和Generic.kl中类似的每个键值对应的键码。这个方法要远比直接修改Generic.kl文件要好的多了。
其实同样也有了新的疑问,如果DEVICE_NAME.kl中没有声明的键值,那么就不会去Generic.kl中查找,这点我是有点自己的建议的,应该像字库一样,在相应的字库中查找不到的字都到fallback字体中查找一下。
3修改按键字符
关键文件*.kcm通过修改对应的kcm 修改对应的按键显示字符,如遇到需要输入特殊字符,需要转码.转码可以参照百度(搜索)特殊字符, 找到特殊的字符复制粘贴到unicode 编码工具转换一下,http://www.cnblogs.com/skykang/archive/2011/06/02/2068802.html
可以使用http://pan.baidu.com/s/1slaO3HN工具来获取上报的按键是什么
4 系统音量有时候自动增加:
思路: 先确定是上层引起还是底层引起。
使用getevent 获取上报的键值定位到哪里上报。。