Maneje las teclas de flecha desde D-pad en la aplicación WebView de Google TV

He construido una aplicación para Android que carga una página html en WebView, y está funcionando bien, excepto el hecho de que las acciones deben suceder en las teclas de flecha D-pad no funcionará. Si cambio la acción de las flechas con otras teclas, funciona. Cargar la página html en el navegador web funciona bien, las teclas de flecha del teclado de la PC devuelven las acciones correctas, pero en Android WebView, las teclas de flecha D-pad no funcionan.

Así es como la llave del tigre presionada en js:

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

Excepto teclas de flecha, presionando cualquier otra tecla devuelve el código de la tecla, pero las flechas no.

Esto podría ser duplicado como aquí: androide WebView: manejar las teclas de flecha en JavaScript, pero no encontró una solución para trabajar.

¿Hay alguna manera de obtener los códigos de las teclas de flecha D-pad en Android WebView?

Hay una aplicación de ejemplo en los ejemplos de Google TV llamada WebAppNativePlayback: https://code.google.com/p/googletv-android-samples/source/browse/#git%2FWebAppNativePlayback

Esencialmente, el d-pad es consumido por la aplicación nativa, por lo que necesita manejarlo, si utiliza un WebView de pantalla completa puede pasar las claves relevantes al WebView inyectándolo en JS.

Las principales piezas de código a prestar atención a son:

En la Actividad, consuma eventos clave y pasa hacia abajo:

 /** * 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); } 

Donde las claves de anulación son:

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

En el fragmento donde vive la webview (aunque esto puede estar en tu actividad):

 /** * 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 es simplemente

 mWebView.loadUrl(jsSend); 

A continuación, en su página web, debe establecer un método accesible o objeto – en este caso, la aplicación establece un objeto window.androidKeyHandler

 /** * This method will set up any additional key handling (ie 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()); } }; 

Que de maneja las llaves como así:

 /** * 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; } }; 

Este ejemplo es probablemente mucho más complejo de lo que necesita ser, pero si usted consigue el trabajo a través de cada pieza de arriba y probarlo, usted debe llegar allí sin demasiada molestia

  • ¿Hay una manera de ocultar y mostrar los controles de zoom en un WebView?
  • Color del enlace de Android WebView
  • Cómo activar y desactivar con seguridad el zoom de WebView según sea necesario
  • Volver a llamar a Android WebView JavaScript a la vista original
  • Ajuste del tamaño dinámico del diseño en Android
  • Deshabilitar doble toque en Zoom / Unzoom en una vista web
  • ¿Cómo deshabilitar el mensaje de pan tostado que a veces aparece con los controles de zoom en un WebView?
  • ¿Hay problemas en la vista Web de Android para SVG? Nivel API 16 +
  • Android: Galería de Webviews
  • Google Analytics: vista web y vista de aplicaciones
  • Impedir que WebView cargue la URL en Android (React Native)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.