无法在Android Tv webview应用程序(HTML+Javascript)上捕获密钥
Not able to capture keycodes on Android Tv webview app(HTML+Javascript)
我正试图为我的网站开发一个安卓电视应用程序。在做了研究之后,我开始使用web-view来加载我的web应用程序,其中包含html-5和JavaScript。
应用程序在web视图上加载良好,我甚至可以在电视模拟器上正确导航,但一旦我在Nexus播放器上部署应用程序,应用程序就不会采取进入事件。当我点击游戏控制器上的按钮A时,它会在点击Nexus播放器上的游戏控制器上的A按钮时出现错误 ------"您没有可以执行此操作的应用程序"
之后,我创建了一个虚拟应用程序,用于在屏幕上显示键以进行调试,并且在所有键事件都被捕获的情况下工作得很好。
我已经弄清楚,因为它是一个html5和基于javascript的应用程序的NP是不兼容的。我对此做了很多研究,但没有找到任何坚实的证据,因为一切都很明显。真的需要一个指针来让它工作。
下面是加载webapp的webview代码:public class ExampleActivity extends Activity implements DialogInterface.OnKeyListener
{
webView = (VideoEnabledWebView)findViewById(R.id.webView);
mButton1=(Button)findViewById(R.id.btn);
webView.addJavascriptInterface(new MyJavaScriptInterface(this),"AndroidFunction");
// Initialize the VideoEnabledWebChromeClient and set event handlers
View nonVideoLayout = findViewById(R.id.nonVideoLayout); // Your own view, read class comments
ViewGroup videoLayout = (ViewGroup)findViewById(R.id.videoLayout); // Your own view, read class comments
//noinspection all
View loadingView = getLayoutInflater().inflate(R.layout.view_loading_video, null); // Your own view, read class comments
webChromeClient = new VideoEnabledWebChromeClient(nonVideoLayout, videoLayout, loadingView, webView) // See all available constructors...
{
// Subscribe to standard events, such as onProgressChanged()...
@Override
public void onProgressChanged(WebView view, int progress) {
// Your code...
}
};
webChromeClient.setOnToggledFullscreen(new VideoEnabledWebChromeClient.ToggledFullscreenCallback() {
@Override
public void toggledFullscreen(boolean fullscreen) {
// Your code to handle the full-screen change, for example showing and hiding the title bar. Example:
if (fullscreen) {
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
getWindow().setAttributes(attrs);
if (android.os.Build.VERSION.SDK_INT >= 14) {
//noinspection all
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
} else {
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
getWindow().setAttributes(attrs);
if (android.os.Build.VERSION.SDK_INT >= 14) {
//noinspection all
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
}
}
});
webView.setWebChromeClient(webChromeClient);
// Navigate anywhere you want, but consider that this classes have only been tested on YouTube's mobile site
webView.loadUrl("http://html5dev.anorakstech.com/iads/");
mButton1.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
webView.loadUrl("javascript:fillContent()");
}
});
}
这是我用于从nexus播放器附带的真实控制器获取关键事件的代码
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
Toast.makeText(ExampleActivity.this, "Key Pressed:"+keyCode, Toast.LENGTH_LONG).show();
webView.loadUrl("javascript:fillContent()");
switch(keyCode)
{
case KeyEvent.ACTION_DOWN:
Toast.makeText(ExampleActivity.this, "Key Down"+keyCode, Toast.LENGTH_LONG).show();
return true;
case KeyEvent.ACTION_UP:
Log.v("EA", "Keycode" + event.getKeyCode());
Toast.makeText(ExampleActivity.this, "Key Released"+event.getKeyCode(), Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_ENTER:
Log.v("EA","Keycode"+event.getKeyCode());
Toast.makeText(ExampleActivity.this, "Pressed Enter"+event.getKeyCode(), Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_UP:
Log.v("EA","Keycode"+event.getKeyCode());
Toast.makeText(ExampleActivity.this, "Pressed 19", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(ExampleActivity.this, "Pressed 20", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
Log.v("EA","Pressed 21");
Toast.makeText(ExampleActivity.this, "Pressed 21", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(ExampleActivity.this, "Pressed 22", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_CAMERA:
Toast.makeText(ExampleActivity.this, "Pressed Camera Button", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_1:
Toast.makeText(ExampleActivity.this, "Pressed 1", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_HOME:
Toast.makeText(ExampleActivity.this, "Pressed Home Button", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_BACK:
Toast.makeText(ExampleActivity.this, "Pressed Back Button"+event.getKeyCode(), Toast.LENGTH_LONG).show();
Intent result = new Intent("Complete");
setResult(Activity.RESULT_OK, result);
finish();
return true;
case KeyEvent.KEYCODE_BUTTON_A:
Toast.makeText(ExampleActivity.this, "Pressed 96", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_BUTTON_B:
Toast.makeText(ExampleActivity.this, "Pressed 97", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_BUTTON_X:
Toast.makeText(ExampleActivity.this, "Pressed 99", Toast.LENGTH_LONG).show();
return true;
case KeyEvent.KEYCODE_BUTTON_Y:
Toast.makeText(ExampleActivity.this, "Pressed 100", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
我在这里无法理解的是,它不显示任何toast从keydown方法,但它确实显示toast当我退出应用程序的Keycode_Back事件是4和任何其他keyevent除了BACK事件它不捕获它或显示任何toast按照上面的代码无论是在nexus播放器或模拟器——真的让我疯了。
任何能给我指出正确方向的建议,我都将非常感激。
编辑1:我现在可以在logcat中获得键值但它仍然不显示Toasts我仍然不断得到"你没有一个应用程序可以在按钮A上做这个点击"
是否有其他组件可能正在使用关键事件?
如果没有,则移除super.onKeyDown(keyCode, event);
虽然这可能不是你的问题,但从文档中:
JavaScript在WebView中默认是禁用的。您可以通过附加到WebView的WebSettings来启用它。你可以使用getSettings()获取WebSettings,然后使用setJavaScriptEnabled()启用JavaScript。
- 来自文本输入null的html javascript变量
- Html/Javascript-如何屏蔽除英国以外的所有欧盟国家,并允许所有非欧盟国家
- html+javascript:如何在某些条件下禁用dropdownlist中的null选项
- 在HTML/JavaScript中,有没有一种方法可以在图像开始加载时知道图像的最终布局尺寸
- HTML/Javascript表单会自动重置
- html/javascript中的可拖动文本
- 在HTML/JavaScript中减去两个数字
- 基本的HTML Javascript程序.这是怎么回事
- 一个html/javascript'小工具'知道用户何时单击了小部件外的任意位置
- HTML/JavaScript拖动&Drop-是否可以使重影图像*NOT*看起来'冲洗掉'
- 在HTML/Javascript文件中获取App Inventor 2变量值
- HTML/JavaScript表格标题
- 如何修复在浏览器中打开后出现在屏幕上的html/Javascript代码
- 在HTML JavaScript头部分运行Google脚本函数
- 如何在 html/javaScript/Jquery 中“浏览文件夹”
- 带有消息html/javascript的进度条
- 在html/javascript中请求撤消/重做事件
- 使用HTML/Javascript表单使用ActiveXObject创建带有嵌入图像的outlook电子邮件
- 使用html/javascript启动小部件
- 移动html/javascript编程中的变量传递