如何欺骗箭头键到我在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