以android状态栏虚拟按键消息为例学习在input系统插入按键消息的处理

简介: 以android状态栏虚拟按键消息为例学习在input系统插入按键消息的处理          最近在考虑不是本机硬件产生的按键消息怎么在本机上转化成硬件按键消息来处理,这个情况在实际应用中很常见,也很必要。

以android状态栏虚拟按键消息为例学习在input系统插入按键消息的处理

 

       最近在考虑不是本机硬件产生的按键消息怎么在本机上转化成硬件按键消息来处理,这个情况在实际应用中很常见,也很必要。从android4.0起,平板电脑的systembar都是在平板下方的位置有几个按键,有返回,MENU,RECENTVOL+,VOL-。这些都是软件图标,点击这个图标,SYSTEMUI就转化出一个对应的按键消息post出去给系统,windowsmanager再做出相应的响应。那systemui又是怎么处理的呢?

     笔者仔细跟了一下,在android4.2 SDK中对应的文件为frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\KeyButtonView.java,在这里面提供了按键消息的转化。关键核心代码如下:

    void sendEvent(int action, int flags) {
        sendEvent(action, flags, SystemClock.uptimeMillis());
    }

    void sendEvent(int action, int flags, long when) {
        final int repeatCount = (flags & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;
        final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode, repeatCount,
                0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
                flags | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
                InputDevice.SOURCE_KEYBOARD);
        InputManager.getInstance().injectInputEvent(ev,
                InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
    }

       可以看出,核心是先new一个消息对象,再通过InputManager对象的getInstanceinjectInputEvent方法来强行插入一个消息,然后再做消息的派发。

         在车机的应用中,按键消息一般都是用单片机来处理的,单片机处理好后通过串口给主控芯片。主控芯片的串口驱动一般都是标准的tty设备,在实际的开发中我们一般不会在驱动中去截这个消息,因为一般来说这种串口互联都带有一定的控制消息,需要解析。通过串口得到的按键消息已经是一个确定的值,但是怎么给应用呢?android对这种input消息已经有一套完整的处理,因此得按套路出牌,那我们就需要把它转化成硬件按键消息。好在android很早就已经考虑到这种情况,因此我们可以使用injectInputEvent去插入一个消息。笔者根据上面的学习,也做了一些测试,确实可行。增加的调用测试代码如下:

                mDownTime = SystemClock.uptimeMillis();
                mCode = 24;
                sendEvent(KeyEvent.ACTION_DOWN, 0, mDownTime);

   SDK源码里有精华,仔细看看这些代码还是有很多东西可学。

 

目录
相关文章
|
5天前
|
Android开发
Android 如何将定制的Launcher成为系统中唯一的Launcher
Android 如何将定制的Launcher成为系统中唯一的Launcher
17 2
|
7天前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
24 0
|
7天前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
33 0
|
7天前
|
Java Android开发
Android OTG U盘无法显示在系统文件管理的修改
Android OTG U盘无法显示在系统文件管理的修改
6 0
|
7天前
|
安全 Android开发
修改Android系统的签名
修改Android系统的签名
19 0
|
7天前
|
安全 Android开发
Android 系统签名
Android 系统签名
16 0
|
7天前
|
Android开发
Android APP 隐藏系统软键盘的方法
Android APP 隐藏系统软键盘的方法
13 0
|
7天前
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
12 0
|
Android开发
Android隐藏虚拟按键,关闭开机动画、开机声音
/*********************************************************************** * Android隐藏虚拟按键,关闭开机动画、开机声音 * 声明: * 有时候,我们可能会希望隐藏掉android中的虚拟按键,当然,那个 * Android的开机动画,有时候也是挺讨人厌的,也是可以隐藏的。
890 0