Android TV 平台 新添按键 与 GlobalKey

 

新添按键

关于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键值的按键

 

GlobalKey

文件位置:/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,然后静态注册,让他常驻系统就好了。


    
        
    

 

你可能感兴趣的:(Android)