其他分享
首页 > 其他分享> > 如何欺骗箭头键到我在Android上的活动

如何欺骗箭头键到我在Android上的活动

作者:互联网

我试图覆盖音量按钮以用作上/下箭头键(即它们应将焦点移到我所有活动的可聚焦视图上.)

为此,我重写了我的活动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);
}

现在的设置方式是使用不同的上下技巧,但都无法正常工作以转移焦点.对于上移键,我只是手动调用dispatchKeyEvent(),将其传递给d-pad上移键,以及在音量按钮上执行的相同操作(因此,当我按下它时应该按下,而在释放时应该释放)我的向上按钮的输出如下所示:

press 24
press 19
release 24
release 19

对于下移按钮,我进行了一些微调,因为我认为也许在释放音量之前就已经发生了dpad按下的事实,所以我制作了一个可同时按下并释放dpad的可运行文件.

    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

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

我在这里俯瞰什么吗?谁能帮助我弄清楚如何欺骗我的活动的箭头键,以便他们实际上可以正确地移动焦点?

解决方法:

我最终发现,您需要使用Instrumentation类发送键事件,并且出于某种原因,您必须在主线程之外进行操作.以下是将上下发送的摘录:

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();

如果您使用这些insdie从问题中覆盖的dispatchKeyEvent,它将正确地移动焦点.

标签:keyevent,android,focus,spoof,arrow-keys
来源: https://codeday.me/bug/20191009/1879966.html