概述
[Description]
How to add a new key on android ICS/ICS2
[Solution]
1.在DCT tool keypad list 文件增加新按键的选项
alpsmediateksourcedctKeypad_YuSu.cmp中添加新键,如SMS快捷键
KEY_SYM
KEY_SMS
KEY_0
alpsmediateksourcedctKeypad_YuSu.cmp中添加新键,如SMS快捷键
KEY_SYM
KEY_SMS
KEY_0
2.打开DCT tool 在keypad矩阵中在相应定义的按键位中添加新按键,如SMS,然后Save
3.修改linux 键盘码文件input.h
由于preloaderubootkernelfactory 等情况分开使用,相应的文件路径下的input.h都应该修改为新按键增加键码值
kernelincludelinuxinput.h
由于preloaderubootkernelfactory 等情况分开使用,相应的文件路径下的input.h都应该修改为新按键增加键码值
kernelincludelinuxinput.h
bioniclibckernelcommonlinuxinput.h
externalkernel-headersoriginallinuxinput.h
externalqemulinux_keycodes.h
mediatekplaformmt6575preloadersrcdriversinclinuxinput.h
Mediatekplaformmt6575ubootinclinuxinput.h
如KEY_SMS
#define KEY_SMS 252
4.增加keypad layout文件键盘映射,linux和android key映射
mediatekconfig<project name>mt6575-kpd.kl
如:
key 252 SMS
注意所用版本和项目使用的KL文件,在adb shell中进入system/usr/keylyout/可以看到所用的KL,可以修改确认使用的KL
一般定义在kpd.c 的新按键会使用mtk-kpd.kl,也就是注册input设备为mtk-kpd的会使用mtk-kpd.kl
新增加设备名称的时候一般会使用generic.kl和qwerty.kl
generic.kl 和qwerty.kl 在alps/frameworks/base/data/keyboards/
mtk-kpd.kl在mediatek/config/<project name>/
其中252 是linux键码,SMS是android识别key值 如果是需要唤醒系统,还需要增加WAKE
如果新按键是全键盘的一些生僻字符,修改: mediatekconfig<project name>mt6575-kpd.kcm
5.修改Java识别keycode
framework/base/include/ui/KeyCodelabels.h
KEYCODES数据结构后面增加
{"SMS",220}
framework/base/native/include/android/KeyCodes.h
在按键定义项增加AKEYCODE_SMS = 220;
6.修改Java 键盘事件
framework/base/core/java/android/view/keyevent.java
/**
*@hide
*/
public static final int KEYCODE_SMS =220;
最后的按键为新增的
private static final int LAST_KEYCODE ==KEYCODE_SMS;
以上/**/注释的code是android 非开放API或变量定义的时候,需要添加Java Doc的识别,否则要运行make update-api才能build通过
如果是系统按键,修改framework/base/libs/ui/input.cpp
isSystemKey()增加case AKEYCODE_SMS:
7.修改XML文件描述符framework/base/core/res/res/values/attr.xml
<enum name="KEYCODE_SMS" value="220" />
8.增加测试验证log在android
frameworkbasepolicysrccomandroidinternalpolidyimplphoneWindowManager.java
在interceptKeyBeforeDispatching()增加
if(keycode== KeyEvent.KEYCODE_SMS){
log.d(TAG, "interceptKeyTi
KEYCODE_SMS keyCode="+ keyCode + " down=" + down + " repeatCount=" + repeatCount + “ keyguardOn=” + keyguardOn + “ mHomePressed=” + mHomePressed + “ cancled=” + canceled)
9.可以抓log确认,或者增加测试APK检测
Kernal log:
<4>[253.828234]kpd: register = fffe ffff ffff ffff ff
<4>[253.828825]kpd: (pressed) HW keycode = 0
<4>[253.829348]kpd: report Linux keycode =
252
<4>[253.829857]kpd: save new keymap state
<4>[254.030814]kpd: register = ffff ffff ffff ffff ff
<4>[254.031405]kpd: (released) HW keycode = 0
<4>[254.031936]kpd: report Linux keycode =
252
<4>[254.032445]kpd: save new keymap state
Android log:
WindowManager: interceptKeyTq keycode=
220 screenIsOn=true keyguardActive=false policyFlags = #2000000 down =false canceled = false
D WindowManager: interceptKeyTi keyCode=
220 down=false repeatCount=0 keyguardOn=false mHomePressed=false canceled=false
D WindowManager: interceptKeyTi
KEYCODE_SMS keyCode=220 down=false repeatCount=0 keyguardOn=false mHomePressed=false canceled=false
p.s.并不是所有的linux keycode framework都会支持处理,如果您需要增加很多按键,就可能超出256(如Touch Panel的手势识别会用到很到键)
inputreader.cpp的KeyboardInputMapper这个class的process函数会先判断是否是isKeyboardOrGamepadKey.
这里面会对按键的大小进行判断,条件是:
1.小于272
2.大于352
3.大于等于256且小于272
4.大于等于288且小于320
满足其一即可。
否则会拦截掉,不会往inputDispatcher和phonewindowmanager.java走
这里面会对按键的大小进行判断,条件是:
1.小于272
2.大于352
3.大于等于256且小于272
4.大于等于288且小于320
满足其一即可。
否则会拦截掉,不会往inputDispatcher和phonewindowmanager.java走
最后
以上就是缓慢小虾米为你收集整理的How to add a new key on android的全部内容,希望文章能够帮你解决How to add a new key on android所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复