android遥控器新增自定义的键值+用遥控器按键实现软键盘字符键的切换(amlogice平台) --- (一)

最近的项目客户有个需求,遥控器上要增加两个按键,分别是系统软键盘的DEL键和字符切换键(也就是左下角那个按键)。任务相对来说比较简单,所以安排给我这个新手做,废话不多说,直接上正题,有不对的地方,欢迎指正。

干活前,先整理下按下遥控器的一个按键后,在系统中的逻辑过程:

遥控器的物理键值 —> linux的标准键值 —> 自定义的字符串 —> 定义这个字符串 —> android标准键值 —> android键值上报 —> 所有上报表中键值判断是否为全局 —> (上报成功)

  1. 以上过程所对应的重要的文件:

    1. device\amlogic\p201\files\remote.conf //物理键值转化为linux标准键值
    2. device\amlogic\p201\files\Vendor_0001_Product_0001.kl //平台相关linux键值转化为字符串。
    3. frameworks/native/include/input/InputEventLabels.h //定义自定义的字符串
    4. frameworks/native/include/android/keycodes.h //android标准键值表
    5. frameworks/base/core/res/res/values/attrs.xml //自定义键值与字符串关系
    6. frameworks\base\core\java\android\view\KeyEvent.java //android需要上报的键值
    7. frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java //这里定义的是全局的按键。在这里定义的按键不会发给app做处理。所有上报数据会先在这里判断是否要做特殊处理,键值的上报可以在这里截取。

    因为是平台相关,所以可能其他平台的文件目录和文件名可能会不一样,这没啥关系,android东西都差不多。最基础的几个文件肯定会一样,比如remote.conf、KeyEvent.java、PhoneWindowManager.java。其他文件文件命名及路径可能会有些差异,建议去KeyEvent.java文件中查看注释信息。里面会告诉你增加一个新的android键值需要同时修改哪些文件。以下为部分注释信息:

    NOTE: If you add a new keycode here you must also add it to:
    //  isSystem()
    //  isWakeKey()
    //  frameworks/native/include/android/keycodes.h
    //  frameworks/native/include/input/InputEventLabels.h
    //  frameworks/base/core/res/res/values/attrs.xml
    //  emulator?
    //  LAST_KEYCODE

总的来说,新增或者修改遥控器键值不外乎分为两种情况:
1. 键值为android标准键值中存在的键值。
2. 键值为android标准键值中不存在的键值。

如果是第一种情况,那非常幸运,简单的改改,基本就搞定了,而第二种情况相对来说会麻烦些。当然还有就是修改键值,比如两个按键的功能互换,那基本可以看做是第一种情况,处理起来和第一种情况一样。

在修改之前,需要先知道一点——怎么去判定android标准键值中有没有自己需要的键值或者说判断某个键值到底是不是我要的那个键值?最笨的方法就是,改完代码以后编译调试… 这样没必要,非常浪费时间… 楼主是新手,所以一开始… 稳稳的犯了这个2… - -!! 可以在板子的终端输入以下命令,先在android端看下是否符合自己需求:

input text keyevent 22      (输入相应的键值,即可在androd端看到效果,此处的22对应的键值是右键,输入后光标会向右移动。)

来看看两种情况分别对应的修改步骤。

修改步骤:
遥控器相应功能android映射表存在:
1. 修改remote.conf,将遥控器物理键值相对应的android功能键值相对应。(注意一般会有副本键值,别改错了)

遥控器相应的功能键值不存在:
如果android键值不存在,那相应操作的步骤会多些,从底层一直到app层都需要修改。当然也可以直接用一个android标准键值中没有用到的键值,这样会少些步骤,但是为了了解这个过程,楼主还是老老实实的从底层一点点改。

1. 修改remote.conf,将遥控器的物理键值映射一个在linux映射表没有用到的键值。 
    0x1C 268     ;TV_SWITCH_CHAR
2. 修改Vendor_0001_Product_0001.kl文件,将上一步linux的键值映射一个字符串,命名:TV_Switch。
    key 268   TV_SWITCH_CHAR
3. 修改keycodes.h文件,增添加一个没有用到的键值。 
    //Darren add 20161213
    AKEYCODE_TV_SWITCH_CHAR = 268,
    //Darren add end
4. 修改InputEventLabels.h,增加和上相同的数值,注意命名不同。
    //darren add 20161213
    DEFINE_KEYCODE(TV_SWITCH_CHAR),
    //darren add end
5. 修改attrs.xml,增加相应键值。
    <enum name="KEYCODE_TV_SWITCH_CHAR" value="268" />
6. 修改KeyEvent.java 定义相应键值。
    //darren add 2016.1213
    public static final int KEYCODE_TV_SWITCH_CHAR = 268;
    //darren add end
7. 语言切换功能不需要做任何处理,可以直接上报,所以不需要改PhoneWindowManager.java文件,如果按键是全局的比如HOME键之类的,那要怎么处理就在这个文件里面写。

修改完成后,在android端获取键值的方式:

keyCode  == KeyEvent.KEYCODE_DPAD_RIGHT

此节只介绍下增加键值的方式。下次再上android端修改android自带的输入法,实现使用遥控按键实现软键盘字符切换功能。

你可能感兴趣的:(android遥控器新增自定义的键值+用遥控器按键实现软键盘字符键的切换(amlogice平台) --- (一))