В примерах 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