gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:02:31 25 4
gpt4 key购买 nike

我正在尝试覆盖音量按钮以充当向上/向下箭头键(即它们应该将焦点移动到我所有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com