Обработка клавиш со стрелками на крестовине в приложении WebView Google Tv

Я создал приложение для Android, которое загружает html-страницу в WebView, и оно работает нормально, за исключением того факта, что действия, которые должны выполняться с помощью клавиш со стрелками D-pad, не будут работать. Если я меняю действие для стрелок с другими клавишами, это работает. Загрузка html-страницы в веб-браузере работает нормально, клавиши со стрелками на клавиатуре ПК возвращают правильные действия, но в Android WebView клавиши со стрелками D-pad не работают.

Вот как я нажимал клавишу тигра в js:

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

За исключением клавиш со стрелками, нажатие любой другой клавиши возвращает код клавиши, а стрелки — нет.

Это может быть дубликатом, как здесь: android WebView: обработка клавиш со стрелками в JavaScript но не нашел решения для работы.

Есть ли способ получить коды клавиш со стрелками D-pad в Android WebView?


person MariusR    schedule 31.10.2013    source источник


Ответы (1)


В примерах Google TV есть пример приложения под названием WebAppNativePlayback: https://code.google.com/p/googletv-android-samples/source/browse/#git%2FWebAppNativePlayback

По сути, d-pad используется собственным приложением, поэтому вам нужно справиться с этим, если вы используете полноэкранный WebView, вы можете передать соответствующие ключи в WebView, внедрив его в JS.

Основные фрагменты кода, на которые стоит обратить внимание:

В действии потребляйте ключевые события и передайте:

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

Этот пример, вероятно, намного сложнее, чем должен быть, но если вы поработаете над каждой частью выше и попробуете его, у вас должно получиться без особых хлопот.

person Matt Gaunt    schedule 01.11.2013
comment
Есть ли общий подход к этому? Как какой-то общий хук jQuery для внедрения keyEvents. Я не могу изменить JCode загружаемой страницы. - person joe1806772; 17.11.2019