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的调用过程

相关推荐
雨白4 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk4 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING5 小时前
RN容器启动优化实践
android·react native
恋猫de小郭7 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker13 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴13 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos