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:
- Android WebView: cómo gestionar los cambios de orientación
- Control de múltiples WebViews desde un diseño inflado
- Crear un menú contextual personalizado en la selección de texto en WebView
- Vista de Android WebView
- ¿Cómo acceder al contenido html de AccessibilityNodeInfo de un elemento WebView mediante Accessibility Service en Android?
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?
- Presentar contenido html como "páginas dinámicas"
- Cómo reproducir URL de vídeo dentro de la vista web de Android
- Dibujo fuera de pantalla WebView a mapa de bits
- Eliminar la superposición de enfoque: color de la vista web
- Reproducir video local en la vista web
- ¿Puedo obtener contenido de WebView con funciones de accesibilidad de android?
- cargar pdf desde url en android
- El contenido de Webview de Android no debe perderse en el cambio de orientación, pero la GUI debe actualizarse correctamente
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
- La cámara no se abre en WebView
- IntelliJ / Android Studio – cómo activar proguard para obfuscate código – paso a paso?