无法在Android Tv webview应用程序(HTML+;Javascript)上捕获关键码
我正在尝试为我的网站开发一个android电视应用程序。在做了研究之后,我开始使用web视图加载包含html-5和JavaScript的web应用程序 该应用程序在web视图上加载良好,我甚至可以在电视模拟器上正确导航,但一旦我将该应用程序部署到Nexus Player上,该应用程序就不会执行输入事件。当我按下游戏控制器上的按钮A时,它会在按下Nexus Player附带的游戏控制器上的按钮A时出现错误--“您没有可以执行此操作的应用程序” 之后,我创建了一个虚拟应用程序,用于在屏幕上显示keyevnts以进行调试,并且在捕获所有keyevnts的情况下运行良好 我发现,由于它是基于htnl5和javascript的应用程序,NP不兼容。 我对此做了很多研究,但找不到任何可靠的东西,因为一切都是表面上的。真的需要一个指针来让它工作 以下是用于加载webapp的webview代码:无法在Android Tv webview应用程序(HTML+;Javascript)上捕获关键码,javascript,android,webview,Javascript,Android,Webview,我正在尝试为我的网站开发一个android电视应用程序。在做了研究之后,我开始使用web视图加载包含html-5和JavaScript的web应用程序 该应用程序在web视图上加载良好,我甚至可以在电视模拟器上正确导航,但一旦我将该应用程序部署到Nexus Player上,该应用程序就不会执行输入事件。当我按下游戏控制器上的按钮A时,它会在按下Nexus Player附带的游戏控制器上的按钮A时出现错误--“您没有可以执行此操作的应用程序” 之后,我创建了一个虚拟应用程序,用于在屏幕上显示key
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;
}
我在这里无法理解的是,它不会显示keydown方法中的任何toast,但当我退出应用程序时,它会显示toast,对于Keycode\u Back事件(4),对于任何其他keyevents(Back事件除外),它不会捕获它,也不会根据上述代码在nexus player或模拟器上显示任何toast——真的吗快把我逼疯了
任何能为我指明正确方向的建议都将不胜感激
编辑1:
我现在可以在logcat中获取keyevnts,但它仍然没有显示祝酒词,而且我仍然不断得到“您没有一个应用程序可以通过单击按钮来执行此操作”
如果没有,则删除super.onKeyDown(keyCode,事件)代码>
虽然这可能不是你的问题
默认情况下,在WebView中禁用JavaScript。您可以通过附加到WebView的WebSettings启用它。您可以使用getSettings()检索WebSettings,然后使用setJavaScriptEnabled()启用JavaScript
如果没有,则删除super.onKeyDown(keyCode,事件)代码>
虽然这可能不是你的问题
默认情况下,在WebView中禁用JavaScript。您可以通过附加到WebView的WebSettings启用它。您可以使用getSettings()检索WebSettings,然后使用setJavaScriptEnabled()启用JavaScript
非常感谢您的快速回复。Java脚本已启用。我仍然在安卓电视上听到“你没有一个应用程序可以做到这一点”,但在Emulator for TV上运行良好,正如我在编辑中所述。有什么建议吗?@Gdroid只是提醒一下,你的页面http://html5dev.anorakstech.com/iads/
破坏了javascript,请先修复。但它在Android电视模拟器上运行良好。怎么会?如果是这样,哪一部分可能会断裂??导航??我不是JS方面的专家。它是由其他开发人员开发的。此外,在TV emulator上运行良好不会指向javascript。JS是否仍然存在问题?这并不是因为它可以在环境中工作,所以代码是正确的。javascript是一种更为“敏感”的语言,因为一个错误就会导致它无法运行代码。您正在模拟器中运行它,里面有一个google chrome客户端。我在firefox中运行,没有代码执行myFunction
已损坏,我将不进一步详细介绍,因为它违反了代码的安全性。最后,在您的onKeyDown
函数中,添加一个默认语句,并检查它是否正在执行。非常感谢您的快速回复。Java脚本已启用。我仍然在安卓电视上听到“你没有一个应用程序可以做到这一点”,但在Emulator for TV上运行良好,正如我在编辑中所述。有什么建议吗?@Gdroid只是提醒一下,你的页面http://html5dev.anorakstech.com/iads/
破坏了javascript,请先修复。但它在Android电视模拟器上运行良好。怎么会?如果是这样,哪一部分可能会断裂??导航??我不是JS方面的专家。它是由其他开发人员开发的。此外,在TV emulator上运行良好不会指向javascript。JS是否仍然存在问题?这并不是因为它可以在环境中工作,所以代码是正确的。javascript是一种更为“敏感”的语言,因为一个错误就会导致它无法运行代码。您正在模拟器中运行它,里面有一个google chrome客户端。我在firefox中运行,没有代码执行myFunction
已损坏,我将不进一步详细介绍,因为它违反了代码的安全性。最后,在onKeyDown
函数中,添加一条默认语句,并检查它是否正在执行。