实现:添加自定义键值需要修改kernel层和framework层下代码,rk3566和rk3588修改的代码和文件路径有差异。
目录
一、kernel层
1、设备树添加键值
我这里随意给了一个名字叫做imagevideo,它的键值名字是KEY_USERKEY1,这个需要我们后面定义,gpio口自己要配对。
gpio_keys: gpio-keys {
status = "okay";
compatible = "gpio-keys";
autorepeat;
imagevideo {
debounce-interval = <20>;
gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>;
label = "imagevideo";
linux,code = <KEY_USERKEY1>;
wakeup-source;
};
};
2、rk-input.h
Rockchip_Android13.0_SDK_RELEASE\kernel-5.10\include\dt-bindings\input rk-input.h
定义 KEY_USERKEY1
#define KEY_USERKEY1 0x2e8
3、input-event-codes.h
Rockchip_Android13.0_SDK_RELEASE\kernel-5.10\include\uapi\linux\input-event-codes.h
#define KEY_USERKEY1 0x2e8
二、framework层
1、KeyEvent.java
Rockchip_Android13.0_SDK_RELEASE\frameworks\base\core\java\android\view KeyEvent.java
这里定义的UI_LANGUAGE 是在Android层自己定义的按键名称,317 是安卓层下的键值
public static final int KEYCODE_UI_LANGUAGE = 317;
注意:如果你定义的按键放在最后,必须得修改LAST_KEYCODE,否则后面定义的按键无效,
如果放在中间没影响。(根据自己实际情况修改)
public static final int LAST_KEYCODE = KEYCODE_UI_LANGUAGE
2、current.txt
Rockchip_Android13.0_SDK_RELEASE\frameworks\base\core\api current.txt (RK3588)
3566_Android11\sdk\frameworks\base\api current.txt(RK3566)
注意:rk3588、rk3566 文件路径不同。在新增api后,进行系统编译可能会报错,需要先在系统中使用make命令,对current.txt进行自动更新。需要配置编译环境后,执行 make update-api 和make test-api-stubs-docs-update-current-api 实现系统更新current文档,再进行编译。
field public static final int KEYCODE_UI_LANGUAGE = 317; // 0x13d
3、attrs.xml
Rockchip_Android13.0_SDK_RELEASE\frameworks\base\core\res\res\values attrs.xml
<enum name="KEYCODE_UI_LANGUAGE" value="317" />
4、keycodes.h
Rockchip_Android13.0_SDK_RELEASE\frameworks\native\include\android keycodes.h
AKEYCODE_UI_LANGUAGE = 317,
5、InputEventLabels.cpp
Rockchip_Android13.0_SDK_RELEASE\frameworks\native\libs\input InputEventLabels.cpp(RK3588)
3566_Android11\sdk\frameworks\native\include\input InputEventLabels.h (RK3566)
DEFINE_KEYCODE(UI_LANGUAGE), \
6、Generic.kl(映射到安卓层)
Rockchip_Android13.0_SDK_RELEASE\frameworks\base\data\keyboards Generic.kl
这里的744 是kerne层的0x2e8的十进制,与framework层相匹配
key 744 UI_LANGUAGE
三、添加系统按键功能
在PhoneWindowManager.java中的interceptKeyBeforeDispatching和interceptKeyBeforeQueueing中添加新按键事件的case
3566_Android11\sdk\frameworks\base\services\core\java\com\android\server\policy
PhoneWindowManager.java
这个有要求的可以添加,不会写的可以搜索PhoneWindowManager.java这个文件分析。一般APP内要求的就只需要APP内获得键值添加功能就行,不需要去安卓系统层添加。
四、功能测试
可以自己用Android studio写一个简单的APP。
public boolean onKeyDown ( int keyCode, KeyEvent event){
Toast.makeText(MainActivity.this, keyCode+"", Toast.LENGTH_SHORT).show();
return true;
}
有键按下就会进入这个函数,安卓界面会打印键值(安卓层定义的键值)
adb输入这两个命令都可以。
也可以在PhoneWindowManager.java内将按键打印log打开,查看打印来判断是否成功添加。