【问题标题】:Remap physical back button for "select_button" in android tv webvew application with java使用java重新映射android tv webview应用程序中“选择按钮”的物理后退按钮
【发布时间】:2021-06-14 13:40:36
【问题描述】:

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

我的应用程序直接在 web 视图中启动游戏流,在全屏模式下,控制器的物理按钮正在处理游戏,接受“查看按钮”和“后退按钮”。 这个“查看按钮”或者如果您更喜欢“选择按钮”是用于 android 电视的返回按钮到主屏幕。所以我必须覆盖这个后退按钮,我想用一个“选择按钮”替换它,它可以与游戏交互以显示地图和库存,就像在 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 tv 的应用按钮映射器,有一个使用 adb 自定义键码的选项,但游戏中没有任何效果。

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

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

21 年 6 月 18 日编辑

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

感谢您的帮助。

【问题讨论】:

    标签: java android button television


    【解决方案1】:

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

    在这种情况下,创建一个在按下后退按钮时调用的方法。并从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;
    

    当你收到KEYCODE_BACK的事件时要调用button_select,你应该手动调用调用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.
    }
    

    【讨论】:

    • 非常感谢您的回答。我理解你的功能。但为了更好地理解,我不是从头开始构建游戏,它是来自大型游戏 AAA 的游戏流媒体,如赛博朋克。所以它们已经具备基本的 xbox 控制器的功能。
    • 所以我想用 keycode_button_select 替换这个后退按钮。这就像以编程方式重新映射,所以我知道我必须听按下的键才能执行另一个键。我认为 Keylistner 适合这个问题。 programcreek.com/java-api-examples/… developer.android.com/reference/android/view/… 我希望它更清楚。你怎么看 ?非常感谢你,我会感谢你的帮助。
    • 当然感谢您的详细解释。我已经更新了我的答案,以实现您想要实现的目标。
    • 哇,令人印象深刻。是的,我认为这是一个好方法。我现在无法测试它,但在晚上直接在 Nvidia shield tv 中使用我的应用程序的新版本进行测试。这是我的项目:github.com/mistertest/devtestyoutube.com/watch?v=fzqqhDurLcs我将特别感谢您。
    • 哇,刚刚看到您的链接,我对您的项目感到非常兴奋!当然,如果您还有其他问题,请告诉我。请接受并投票给我的答案,它有帮助!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多