【android】手机增加一个新的实体按键
本文基于android 6.0 进行增加
安卓按键的几种方式
ACCDET 模式, 耳机
mtk-kpd 模式 普通按键,
其他模式可以自己测试
需求: 特殊定制的耳机增加一个按键,发送特定的广播
1.驱动层进行按键定义
耳机:ACCDET.KL (/device/mediatek/mt6580/ACCDET.KL)
自己找对应的,这是MTK给我们的版本 我这里定义的是 key 252 HEADSET_PTT
key 122 ENDCALL key 163 MEDIA_NEXT key 164 HEADSETHOOK key 165 MEDIA_PREVIOUS key 114 VOLUME_DOWN key 115 VOLUME_UP key 582 VOICE_ASSIST key 252 HEADSET_PTT
这是固定的写法,注意这个值不要冲突
如果是手机上的按键:mtk-kpd.kl(/device/haocheng/r882/mtk-kpd.kl)
所有按键码都不能冲图
input.h(kernel-3.18/include/uapi/linux/input.h)
代码太多,只提取增加部分
... #define KEY_HEADSET_PTT 252 //chc add ...
KeyCodes.h(/frameworks/native/include/android/KeyCodes.h)
/* * Key codes. */ enum { AKEYCODE_HEADSET_PTT = 276, //chc add 这个值是我们上层所需要的 276 ,不能重复 };
InputEventLabels.h(/frameworks/native/include/input/InputEventLabels.h)
<attr name="keycode"> ... <enum name="KEYCODE_HEADSET_PTT" value="276" /> <!--chc add --> ... </attr>
KeyEvent.java(frameworks/base/core/java/android/view/KeyEvent.java)
... /** * @hide */ public static final int KEYCODE_HEADSET_PTT = 276; //chc add 这个值个attrs.xml InputEventLabels.h 值相同 private static final int LAST_KEYCODE = KEYCODE_HEADSET_PTT; public static final boolean isSystemKey(int keyCode) { ... switch (keyCode) { case KeyEvent.KEYCODE_HEADSET_PTT: //chc add return true; } ... } ... public static final boolean isMediaKey(int keyCode) { //因为是耳机上的多以这个也得加 switch (keyCode) { case KeyEvent.KEYCODE_HEADSET_PTT: //chc add return true; } }
到此这个按键就可以正常工作了
接下来就是自己的处理逻辑了
PhoneWindowManager.java(frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java)
... @Override public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { ... case KeyEvent.KEYCODE_HEADSET_PTT:{ if(down){ if(isKeyCodeActivity()) { result |=ACTION_PASS_TO_USER; break; } Intent intent = new Intent(); intent.setAction("android.zed3.action.HEADSET_BUTTON_DOWN"); intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); mContext.sendBroadcast(intent); }else{ if(isKeyCodeActivity()) { result |=ACTION_PASS_TO_USER; break; } Intent intent = new Intent(); intent.setAction("android.zed3.action.HEADSET_BUTTON_UP"); intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); mContext.sendBroadcast(intent); } break; } ... } ...
到此 一个新增的耳机按键就添加完成了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
2019-06-24 【shuguo】常用服务配置
2019-06-24 【php】PHP中Session ID的实现原理
2019-06-24 【php】PHP 中cookie 和session的联系以及session配置