关于Android TV,Android平台按键的配置大致可分为以下几步(以Settings为例):
1. 检查驱动
在添加按键之前,要先检查一下驱动层是否配置成功。
可以抓一份遥控器按下Settings按键的打印,查看有没有code产生;
或者直接去问驱动的同事添没添就好了。:)
2. Vendor_XXX_Product_XXX.kl
这个文件名对于不同的代码来说是不确定的,一般来说这个文件都是由方案商来提供的。
按照Android的标准来说,如果每次要查找一个键值,都会有这样一个查找顺序:
/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/system/usr/keylayout/DEVICE_NAME.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
/data/system/devices/keylayout/DEVICE_NAME.kl
/system/usr/keylayout/Generic.kl
/data/system/devices/keylayout/Generic.kl
找不到就查找下一个文件,如果到最后依然找不到,那么就进入了Generic.kl文件。
一般来说,直接将需要新添的键值直接添加在方案商提供的kl文件中即可。
Key 200 SETTINGS
这里的200是驱动给出的code,SETTINGS是自己定义的一个名字,这个名字需要和后面写的名字对应起来,才可以生效。
3. InputEventLabel.h
文件位置:./frameworks/native/include/input/InputEventLabels.h
这个文件是将刚才所写的SETTINGS定义。
DEFINE_KEYCODE(SETTINGS),
4. keycodes.h
文件位置:./frameworks/native/include/android/keycodes.h
AKEYCODE_SETTINGS = 100,
SETTINGS是名字,然后前面添加 AKEYCODE_ ;100是最后想要的键值。
5. KeyEvent.java
文件位置:./framework/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_SETTINGS = 100
这个 KEYCODE_SETTINGS 确定了最后的键名。
6. PhoneWindowManager.java
文件位置:./framework/base/services/core/java/com/android/service/policy/PhoneWindowManager.java
if(keycode == KeyEvent.KEYCODE_SETTINGS){
//to do something
}
注意
1. 按键会下发两次,分别是down和up,在对按键进行操作的时候需要做这两方面的处理,在一般情况下,会直接进行 !down 过滤,以只相应按键的抬起动作。
2. 在kl文件中,可以允许多个code对应一个键名,但不允许一个code对应多个键名。
3. 在改动完成KeyEvent.java和PhoneWindowManager.java后,应更新api,更新api串口命令:make update-api。
调试命令
dumpsys input 查看当前映射到哪个文件
getevent 查看输入的键值
input keyevent XXX 模拟XXX键值的按键
文件位置:/frameworks/base/core/res/res/xml/global_keys.xml
如果根据方案商的不同,可能会有所修改。
GlobalKey的意思就是系统根据配置的按键和包名,以达到按下这个按键后,系统自动发送一个消息给这个组件。
首先,在global_keys.xml中配置,keycode指定需要触发的按键,包名指定要接受组件的包名。
而接收的组件呢
package com.syc.demo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//to do something
}
}
并且,接收方的广播接收器的action必须要配置成GLOBAL_BUTTON,然后静态注册,让他常驻系统就好了。