微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用java重新映射android tv webvew应用程序中“select_button”的物理后退按钮

如何解决使用java重新映射android tv webvew应用程序中“select_button”的物理后退按钮

我是一名法国开发人员,我正在使用 java 在 web 视图中创建一个关于云游戏的 android 电视应用程序。

我的应用程序直接在 web 视图中启动游戏流,在全屏模式下,控制器的物理按钮与游戏一起工作,除了“查看按钮”和“后退按钮”。 这个“查看按钮”或者你更喜欢的“选择按钮”是安卓电视的主屏幕后退按钮。所以我必须覆盖这个后退按钮,我想用一个“选择按钮”替换它,它可以与游戏交互以显示地图和库存,就像在 rpg 游戏中一样。

我知道名称将是“button_select”,用于与 PC 游戏进行交互。所以现在在 android tv 中我总是会重定向到主页。

这是我的代码示例。

public class MainActivity extends AppCompatActivity {
    @Override
    public void onBackpressed() {
        return;
    }

有了这个覆盖,后退按钮现在完全禁用,我想替换它或调用“button_select”。我读了一些关于“处理程序”的内容,也许这就是解决方案。

编辑 16/06/2021


我测试了很多代码,但没有任何效果

这个

@Override
    public boolean onKeyDown(int keyCode,KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            keyCode = KeyEvent.KEYCODE_BUTTON_SELECT;
        }
        return super.onKeyDown(keyCode,event);
    }

及其变种

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int action = event.getAction();
        int keyCode = event.getKeyCode();

        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (action == KeyEvent.ACTION_DOWN ){
                    //Do something in the back button
                    keyCode = KeyEvent.KEYCODE_BUTTON_SELECT;

                }
                return true;
            default:
                return super.dispatchKeyEvent(event);
        }
    }

在游戏中,后退按钮被禁用,但“keycode_button_select”不与游戏交互。没有什么。我用“keycode button_start”测试了同样的东西。

我测试了 android 电视的应用按钮映射器,有一个带有 adb 的自定义键码选项,但在游戏中没有任何效果

https://play.google.com/store/apps/details?id=flar2.homebutton&hl=fr&gl=US

因此,根据代码或应用程序,目前没有任何效果,我不想为此强制使用“root 模式”。也许我只需要在 Java 中实现一个游戏手柄插件。我不知道...

编辑 18/06/21

我可以捕获“后退按钮”并显示出现在屏幕中间的对话框警报。但是之后的动作暂时没有效果。我现在测试了“dispatchEvent”但没有成功。我将测试“机器人”功能。也许“robot”和“dispatchEvent”会一起工作。

感谢您的帮助。

解决方法

我假设您想在用户按下 button_select 时调用 back button 键。

在这种情况下,创建一个在按下后退按钮时调用的方法。并从 onBackPressed 方法调用该方法。

例如:

public void callButtonSelectKey() {
    //This could be done in either ways.
    //1.
    val i = Instrumentation()
    i.sendKeyDownUpSync(KeyEvent.KEYCODE_BUTTON_SELECT)
    //2.
    val keyEventDown = KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BUTTON_SELECT)
    val keyEventUp = KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BUTTON_SELECT)
    dispatchKeyEvent(keyEventDown)
    dispatchKeyEvent(keyEventUp)

}

@Override
public void onBackPressed() {
    methodToCallUponBackPress();
    return;
}

现在当用户按下后退按钮时,它会调用 callButtonSelectKey 方法调用“button_select”键。 (即将后退按钮重新映射到 button_select)

如果您还有其他问题,请告诉我。

编辑

在面向对象的语言中,覆盖类的(在本例中为 KeyEvent)字段(在本例中为 keycode)将无济于事。喜欢下面的代码:

//Do something in the back button
keyCode = KeyEvent.KEYCODE_BUTTON_SELECT;

要在收到 button_select 的事件时调用 KEYCODE_BACK,您应该手动调用该方法来调用 Key Event,在这种情况下,我之前给您的方法 dispatchKeyEvent 。>

所以你应该把你的改变变成这样:

@Override
public boolean onKeyDown(int keyCode,KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK){
        //This could be done in either ways.
       //1.
       val i = Instrumentation()
       i.sendKeyDownUpSync(KeyEvent.KEYCODE_BUTTON_SELECT)
       //2.
       val keyEventDown = KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BUTTON_SELECT)
       val keyEventUp = KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_BUTTON_SELECT)
       dispatchKeyEvent(keyEventDown)
       dispatchKeyEvent(keyEventUp)

    }
    return super.onKeyDown(keyCode,event); //Edit this return statement if you want to ignore a keypress.
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?