Android物理按键事件处理

文章详细介绍了在Android中如何处理按键事件,包括重写onKeyDown等回调方法来拦截和响应特定按键,如返回键的退出程序逻辑。同时,列出了常见的按键代码如KEYCODE_BACK和KEYCODE_MENU。此外,还阐述了Android框架层的按键消息派发流程,并展示了如何在系统层面添加新的按键(例如FM键)到Android系统。
摘要由CSDN通过智能技术生成

一、重写方法,处理对应的按键回调事件

当处理物理按钮事件的时候提供的回调方法有

  • onKeyDown()
  • onKeyUp()
  • onKeyLongPress()

如下是例子:返回键被按下,提示退出程序

public class MainActivity extends Activity {
    private long exitTime = 0; //退出时间变量值
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            exit();
            return true;  //拦截返回键
        }
        return super.onKeyDown(keyCode, event);
    }
    
    public void exit() {
        if ((System.currentTimeMillis() - exitTime) > 2000) { //计算按键时间差是否大于两秒
            Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
            exitTime = System.currentTimeMillis();
        } else {
            finish();
            System.exit(0); //销毁强制退出
        }
    }
}

二、键值

按键名中文名code
KEYCODE_POWER电源键26
KEYCODE_HOMEHOME键3
KEYCODE_BACK返回键4
KEYCODE_MENU菜单键82
KEYCODE_CAMERA拍照键27
KEYCODE_VOLUME_UP音量增加键24
KEYCODE_VOLUME_DOWN音量减少键25
KEYCODE_VOLUME_MUTE扬声器静音键164
KEYCODE_CALL拨号键5
KEYCODE_ENDCALL挂机键6

三、framework按键消息派发

按键消息派发(android 4.2(jb5))

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
  dispatchUnhandledKey
        interceptFallback
            interceptKeyBeforeQueueing [interceptKeyTq]
            interceptKeyBeforeDispatching [interceptKeyTi]

四、增加一个按键

底层抓键值:adb shell getevent /dev/input/event0
adb shell getevent /dev/input/event1
0001 012c 00000001 : 十六进制,012c=300

先用adb shell getevent,可以看到选项,后面的是可以选的

增加一个按键([android 5.16.0])

alps/device/xxx/xxx/mtk-kpd.kl
 key 300   FM

alps/frameworks/native/include/android/keycodes.h
  AKEYCODE_FM  = 300,//added for fm

alps/frameworks/native/include/input/InputEventLabels.h
static const InputEventLabel KEYCODES[] = {
    // added for fm
    DEFINE_KEYCODE(FM), //= {"FM",AKEYCODE_FM}
}

//注:宏定义函数#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key } = {"key", AKEYCODE_key}
//#是把宏参数变为一个字符串,##是把两个宏参数连接在一起

alps/frameworks/base/core/java/android/view/KeyEvent.java
    /**
     * @hide
     */
    public static final int KEYCODE_FM            = 300;
    //added for fm
    private static final int LAST_KEYCODE = KEYCODE_FM;//modify for fm
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy程序猿2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值