在 WebView Google Tv 应用上处理方向键上的箭头键

2023-11-22

我已经构建了一个 Android 应用程序,它在 WebView 中加载 html 页面,并且工作正常,除了应该在方向键上发生的操作不起作用这一事实。如果我用其他键更改箭头的操作,它就会起作用。在 Web 浏览器中加载 html 页面工作正常,PC 键盘箭头键返回正确的操作,但在 Android WebView 中,方向键箭头键不起作用。

这是我在js中按下老虎键的方式:

window.addEventListener('keydown', keyDownHandler, true);
function keyDownHandler(evt){
var keyCode=evt.keyCode;
alert(keyCode);
}

除箭头键外,按任何其他键都会返回键代码,但箭头不会。

这可能是重复的,如下所示:android WebView:处理 JavaScript 中的箭头键但没有找到可行的解决方案。

有什么方法可以在 Android WebView 中获取 D-pad 箭头键代码吗?


Google TV 示例中有一个名为 WebAppNativePlayback 的示例应用程序:https://code.google.com/p/googletv-android-samples/source/browse/#git%2FWebAppNativePlayback

本质上,方向键是由本机应用程序使用的,因此您需要处理这个问题,如果您使用全屏 WebView,您可以通过将相关键注入到 JS 中来将相关键传递给 WebView。

需要注意的主要代码片段是:

在Activity中,消费按键事件并向下传递:

/**
 * This method will check if the key press should be handled by the system
 * or if we have chosen to override it to pass to the WebView. In
 * development builds of the application, the R key is used refresh the page
 * (required to ensure cached versions of the page are not used)
 */
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (mIsDevelopmentBuild && event.getKeyCode() == KeyEvent.KEYCODE_R) {
        mWebViewFragment.refresh();
    }

    int eventKeyCode = event.getKeyCode();
    for (int i = 0; i < mOverrideKeyCodes.length; i++) {
        if (eventKeyCode == mOverrideKeyCodes[i]) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
                mWebViewFragment.handleKeyInjection(eventKeyCode);
            }
            return true;
        }
    }

    return super.dispatchKeyEvent(event);
}

覆盖键的位置是:

mOverrideKeyCodes = new int[] {
                KeyEvent.KEYCODE_DPAD_CENTER,
                KeyEvent.KEYCODE_DPAD_UP,
                KeyEvent.KEYCODE_DPAD_LEFT,
                KeyEvent.KEYCODE_DPAD_DOWN,
                KeyEvent.KEYCODE_DPAD_RIGHT
        };

在网络视图所在的片段中(尽管这可能在您的活动中):

/**
 * Given a key code, this method will pass it into the web view to handle
 * accordingly
 * 
 * @param keycode Native Android KeyCode
 */
public void handleKeyInjection(int keycode) {
    String jsSend = "javascript:androidKeyHandler.handleUri('nativewebsample://KEY_EVENT;"
            + keycode + ";');";
    loadJavascriptAction(jsSend);
}

loadJavascriptAction 很简单

mWebView.loadUrl(jsSend);

然后在您的网页中,您需要设置一个可访问的方法或对象 - 在本例中应用程序设置一个对象 window.androidKeyHandler

/**
* This method will set up any additional key handling (i.e. Android key handling)
* @function
*/
IndexPage.prototype.setUpKeyHandling = function () {
    if(this.isEmbedded()) {
        // We want the native app to access this
        window.androidKeyHandler = new AndroidKeyHandler(this.getFocusController());
    }
};

哪个比像这样处理键:

/**
* Handle a keypress directly from the native app
* @function
* @param {int} keyCode The native Android key code
*/
AndroidKeyHandler.prototype.handleNativeKeyPress = function (keyCode) {
    var focusController = this.getFocusController();
    switch(parseInt(keyCode, 10)) {
        case 23:
            // DPAD Center
            console.log("Native Enter");
            if(focusController.getCurrentlyFocusedItem()) {
                focusController.getCurrentlyFocusedItem().onItemClick();
            }
            break;
        case 20:
            // DPAD Down
            console.log("Native Down Pressed");
            focusController.moveFocus({x: 0, y: -1});
            break;
        case 21:
            // DPAD Left
            console.log("Native Left Pressed");
            focusController.moveFocus({x: -1, y: 0});
            break;
        case 22:
            // DPAD Right
            console.log("Native RIGHT Pressed");
            focusController.moveFocus({x: 1, y: 0});
            break;
        case 19:
            // DPAD Up
            console.log("Native UP Pressed");
            focusController.moveFocus({x: 0, y: 1});
            break;
        default:
            console.log("Keycode not registered");
            break;
    }
};

这个例子可能比它需要的复杂得多,但是如果你完成上面的每一部分并尝试一下,你应该不会有太多麻烦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WebView Google Tv 应用上处理方向键上的箭头键 的相关文章

  • 如何获取每个StorageVolume的可用大小和总大小?

    背景 谷歌 悲伤 计划破坏存储权限 https www xda developers com android q storage access framework scoped storage 这样应用程序将无法使用标准文件 API 和文件
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始

随机推荐

  • C++ 为什么我不能将基类分配给子类?

    我有这样的代码 class Base public void operator const Base base class Child public Base public void func const Base base Child c
  • 如何在Android Studio中通过Glide在header中添加授权?

    我使用的是 Glide 版本 4 7 1 我不知道如何通过滑动来验证图像 这段代码是我所做的 我创建 private static final String AUTHORIZATION ss id doa3cx8OV3aGLThRrpnh
  • 与 MomentJS 的时间比较

    我正在尝试将时间与 momentJS 进行比较 这是我的脚本 document ready function var today moment console log today format hh mm if today format D
  • Gradle 中基于多风味库的单风味模块

    我正在研究多种口味app 下面的gradle文件 它使用一个名为的库tracker遵循相同的口味internal and external 现在对于棘手的部分来说 有一个名为的新模块feature 这个没有味道 但需要tracker作为依赖
  • adb 的“grep”命令出现问题

    当我在 adb 中写入时 adb shell dumpsys window windows grep E mCurrentFocus mFocusedApp 我得到错误输出 grep is not recognized as an inte
  • 后台任务中的 IOC DI 多线程生命周期范围

    我有一个使用 IOC 和 DI 来创建和注入服务的应用程序 我有一个处理一些业务逻辑的服务层 在服务层中我有一个与数据库通信的存储库 该存储库使用的 DataContext 不是线程安全的 我想使用后台任务在服务上异步运行一些功能 但知道这
  • AutoMapper 自定义类型转换器不工作

    我在用特洛伊 古德的分页列表在我的 WebApi 中提供分页信息 他的包返回一个 IPgedList 它实现 IEnumerable 但也包含自定义属性 例如 IsLastPage PageNumber PageCount 等 当您尝试从
  • 寻找重复出现的模式

    假设我有一个具有重复模式的数字 即存在一串重复的数字 以便形成有问题的数字 例如 这样的数字可能是1234123412341234 通过重复数字创建1234 我想做的是找到重复自身的模式来创建数字 因此 给定1234123412341234
  • 从 C# 运行 PowerShell 脚本

    我正在尝试使用 Visual Studio 构建图形平台 我不是开发人员 我想在单击按钮时运行 PowerShell 或批处理文件 问题是 当我尝试 C 语法时 即使我安装了 PowerShell 扩展 它也不起作用 我尝试了一些在互联网上
  • 调试Linux内核恐慌

    我是内核调试的新手 下面是最后一条内核消息 根据我的理解 它正在尝试访问空指针 但我不明白为什么它要关闭 cup 0 Unable to handle kernel paging request at virtual address 400
  • 如何使 NSView 透明并显示 NSWindow 下的内容? [复制]

    这个问题在这里已经有答案了 我正在 osx 中制作一个放大镜风格的应用程序来娱乐 但我遇到了一个我似乎找不到答案的障碍 我在 NSWindow 中有一个 NSView 我将视图设置为clearColor 将 alpha 设置为 0 25 但
  • 如何覆盖 4mb API 路由正文大小限制?

    我尝试了多种方法来覆盖 API 路由主体大小限制 https nextjs org docs messages api routes body size limit 设置自定义服务器 基本 Express 应用程序 在相关路由上传递 bod
  • 在R中按时间范围合并两个数据帧

    我正在处理牛的繁殖力数据 在一个表 数据框 中 我记录了一头牛所执行的所有服务 例如授精 在另一个表中 我得到了妊娠诊断 阳性或阴性 两者都有一个唯一的 ID animal id 我的挑战是成功地将两个表合并到正确的数据范围内 这意味着我需
  • 有没有办法使用内存分配报告来分析 ruby​​ 1.9.2 脚本?

    我的 ruby 应用程序遇到了瓶颈 但我不知道它在哪里变慢 我找到了memprof 但它不支持1 9 我还发现 ruby prof 似乎在 1 9 2 上运行良好 但内存分配需要修补 ruby 解释器 并且我只能找到 ruby 1 8 的补
  • Spring多事务管理器、单事务

    我有一个复杂的情况 我必须使用 2 个不同的数据库 因此我使用 2 个不同的事务管理器 Spring中有没有办法将这些事务管理器链接到单个事务中工作 如果第二个数据源出现异常 第一个数据源的更改应该回滚
  • vue代理设置不起作用

    我有一个 Vue 项目 vue cli 3 x 我定义的代理package json基于本文不管用 目标服务器看不到 API 请求 我在这里缺少什么 vue 文件
  • xslt 仅在一个节点中将 \n 替换为

    嘿 我有一个节点 其中包含一条消息 例如 string1字符串2刺3 但是 当它渲染时 它会渲染所有一行 我如何将所有 n 替换为 s 我试过了 但我收到这个错误 加载样式表时出错 XSLT XPath 函数无效 我该怎么做呢 在您要处理的
  • Android使用buildozer编译错误

    我正在尝试编译一个 apk this one 使用构建器 但我不断收到下面的命令失败消息 我尝试过使用不同的 python 路径 重新安装 buildozer 使用不同的 buildozer 路径 从 Mac HD 编译 使用 sudo 编
  • Eigen - 将常量数组映射到动态向量

    我需要定义一个函数 它需要constC 数组并将其映射到Eigen地图 以下代码给我一个错误 double data 10 0 0 typedef Eigen Map
  • 在 WebView Google Tv 应用上处理方向键上的箭头键

    我已经构建了一个 Android 应用程序 它在 WebView 中加载 html 页面 并且工作正常 除了应该在方向键上发生的操作不起作用这一事实 如果我用其他键更改箭头的操作 它就会起作用 在 Web 浏览器中加载 html 页面工作正