Android 模拟按键功能实现

开发中遇到一个按键,需要发送两个键值,一帮情况下,只能一个按键只能发送一个键值,那两个键值怎么实现呢?其实就是一个api调用的事情,android都有现成的我们直接拿来用就可以了!

代码如下

java 复制代码
services/core/java/com/android/server/policy/PhoneWindowManager.java 下




  /* 模拟音量+键操作 */
    private final Runnable mKeyCodeVolumeUpHandler = new Runnable() {
        @Override
        public void run() {
             if (DEBUG_KEYGUARD) Slog.d(TAG, "mKeyCodeVolumeUpHandler run,send code KEYCODE_VOLUME_UP" );
            new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_VOLUME_UP);
            autoSpinBtnChangeChannelDefaultMode.removeMessages(null);
            autoSpinBtnChangeChannelDefaultMode.sendMessageDelayed(Message.obtain(),3*1000);
        }
    };


    /* 模拟音量-操作 */
    private final Runnable mKeyCodeVolumeDownHandler = new Runnable() {
        @Override
        public void run() {
            if (DEBUG_KEYGUARD) Slog.d(TAG, "mKeyCodeVolumeUpHandler run,send code KEYCODE_VOLUME_DOWN" );
            new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_VOLUME_DOWN);
            autoSpinBtnChangeChannelDefaultMode.removeMessages(null);
            autoSpinBtnChangeChannelDefaultMode.sendMessageDelayed(Message.obtain(),3*1000);
        }
    };



 // TODO(b/117479243): handle it in InputPolicy
    /** {@inheritDoc} */
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
        final int keyCode = event.getKeyCode();
        final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
        boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
                || event.isWakeKey();
          
      if (CHANNEL_UP_KEY == event.getKeyCode()) {
            //
            mHandler.post(mKeyCodeVolumeUpHandler);
            if (DEBUG_KEYGUARD) Slog.d(TAG, "CHANNEL_UP_KEY to click,  simulate to            volume up action");


        }else if (CHANNEL_DOWN_KEY == event.getKeyCode()) {
            if (DEBUG_KEYGUARD) Slog.d(TAG, "CHANNEL_DOWN_KEY to click,  simulate to volume down action");
            mHandler.post(mKeyCodeVolumeDownHandler);


        }

 }

以上代码中,在interceptKeyBeforeQueueing 方法中,拦截指定键值,然后调用发送一个handler的任务,然后在runnable中实现模拟按键就可以了!

参考文章:

Instrumentation中的sendKeyDownUpSync的调用过程

相关推荐
Android小码家16 分钟前
framework&framework-minus-apex&android.jar的区别
android·python·jar
技术风向解码者28 分钟前
安卓跨端选型:为什么优先看 Kuikly
android
科小怪29 分钟前
大肥鱼桌宠下载(2026最新版):在安卓桌面上养一条会走会弹会碎碎念的胖鱼
android
qq36219670532 分钟前
安卓安装包完整性校验:怎么确认下载的 APK 没被动过手脚
android
FLJwu1 小时前
《运动相机硬件防护选型实战》专栏|第二篇(PPTC 自恢复保险丝)
android·经验分享·数码相机·1024程序员节·运动相机
驰骋工作流11 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程13 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽16 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_5633714717 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
AIsoft_868920 小时前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频