android - 如何欺骗箭头键到我在 android 上的 Activity

标签 android focus keyevent arrow-keys spoof

我正在尝试覆盖音量按钮以充当向上/向下箭头键(即它们应该将焦点移动到我所有 Activity 的可聚焦 View 上。)

为此,我覆盖了我的 Activity dispatchKeyEvent() 方法请注意,我也尝试了 onKeyDown() 但我的部分音量键事件仍在继续系统,当你改变音量时,我的设备有声音反馈。我仍然可以听到哔哔声,但实际上并没有改变音量。切换到 dispatchKeyEvent() 消除了系统发出的蜂鸣声。

这是我当前的 dispatchKeyEvent() 方法:

@Override
public boolean dispatchKeyEvent(KeyEvent ke){
    int keyCode = ke.getKeyCode();
    if(ke.getAction() == KeyEvent.ACTION_DOWN){
        print("press " + keyCode);
        if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
        { 
            mTxt.postDelayed(pressDown, 600);
            return true;
        }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
        { 
            KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP); 
            dispatchKeyEvent(key); 
            return true;
        } 
    }else if(ke.getAction() == KeyEvent.ACTION_UP){
        print("release " + keyCode);
        if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
        { 
            /*KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN); 
            dispatchKeyEvent(keyUp);*/
            return true;
        }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
        { 
            KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP); 
            dispatchKeyEvent(keyUp);
            return true;
        } 
    }
    return super.dispatchKeyEvent(ke);
}

它现在的设置方式是使用不同的向上和向下技术,但都不能正确地转移焦点。对于 Up 键,我只是手动调用 dispatchKeyEvent() 将其传递给 d-pad up 键和​​音量按钮上发生的相同 Action (所以当我按下它时应该按下,当我释放它时应该释放)向上按钮的输出如下所示:

press 24
press 19
release 24
release 19

对于向下按钮我稍微调整了它,因为我认为可能是在音量释放打破它之前发生了 dpad 按下这一事实,所以我制作了一个既可以按下又可以释放 dpad 按钮的 runnable

    pressDown = new Runnable(){
        @Override
        public void run(){
            KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN); 
            dispatchKeyEvent(key); 
            KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN); 
            dispatchKeyEvent(keyUp);
        }
    };

然后我将其延迟几分之一秒,以便我有机会释放音量。我的向下按钮输出如下所示:

press 25
release 25
press 20
release 20

如果我将 USB 键盘插入我的设备并按箭头键,焦点会正确移动并且我会看到向上的输出:

press 19
release 19

向下:

press 20
release 20

唯一的区别(据我所知)是当我按下键盘上的箭头时焦点实际上移动正确,而当我按下音量按钮(欺骗箭头按钮)时根本不移动

我是不是忽略了什么?任何人都可以帮我弄清楚如何欺骗我的 Activity 的箭头键,以便他们真正正确地移动焦点吗?

最佳答案

我最终发现您需要使用 Instrumentation 类来发送按键事件,并且出于某种原因您必须在主线程之外执行此操作。以下是将向下和向上发送的 fragment :

new Thread(new Runnable() {         
   @Override
   public void run() {                 
       new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
   }   
}).start();

new Thread(new Runnable() {         
   @Override
   public void run() {                 
       new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
   }   
}).start();

如果您使用这些独立于问题中被覆盖的 dispatchKeyEvent,它将正确地移动焦点。

关于android - 如何欺骗箭头键到我在 android 上的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601892/

相关文章:

android - 两个android设备之间基于RFCOMM的蓝牙通信

android - 如何将对象返回到表面 View android

jquery - 多个输入的清算值(value)?

javascript - 禁用输入选项卡

javascript - Bootstrap 3 btn-group 在单击页面上的任何位置时丢失事件类

java - android - 获取软键盘按键

javascript - 如何创建关键事件并将其传递给文档?

android - 设置为 ImageView 后回收位图

java - 为什么没有检测到 key ?

android - xamarin 表单与 ListView 和复选框的实验室绑定(bind)问题