当前位置: 首页 > article >正文

Android物理按键事件处理

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

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

  • 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

http://www.kler.cn/a/6354.html

相关文章:

  • Java重要面试名词整理(四):并发编程(下)
  • springboot项目对数据库密码加解密
  • Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
  • UE5 渲染管线 学习笔记
  • webrtc音频模块(三) windows Core Audio API及声音的播放
  • web-密码安全口令
  • springboot 数据库应用
  • .NET Core 中实现分布式事务的几种方案
  • 理想汽车的雷达在无人陵园内看到鬼?网友:按一下喇叭看会不会聚过来!
  • 基于SpringBoot开发的人事管理系统
  • Python 高级编程(文件操作)
  • TCP / IP 模型
  • AtCoder Beginner Contest 296 (A~D)
  • 虚拟机与主机互传文件
  • 【C++】哈希
  • C++初阶—string类(1)
  • web前端面试题之webpack和其他
  • spring七种事务传递机制及其原理
  • 会C#如何学习Python的几个关键点
  • pytorch安装和测试
  • MyBatis
  • 注册谷歌账户教程--解决注册谷歌账户“此电话号码无法用于进行验证”问题--亲测已解决--谷歌账户注册全流程
  • 【面试】Java并发编程面试题
  • XGBoost的简单安装及入门使用
  • Kubuntu(Ubuntu) 22.04安装OBS Studio
  • 简述线程安全问题的原因和解决方案