我正在开发一个带有浮动WebView的Android应用程序,它使用Youtube的IFrame API播放Youtube视频。浮动视图作为服务实现,当用户浏览应用程序的不同活动时,它始终处于打开状态,当应用程序最小化时,浮动视图也会浮动。
现在的问题是,当视图组件在活动中呈现时,视频的声音会滞后或断断续续。这是我做过的故障排除:
我做了两个简单的活动,没有网络工作,只是布局中的一堆按钮。当您导航到这些活动或返回时,声音会被切断一秒或更长时间。
我在应用程序和WebView上设置了硬件加速属性。这些是我用来将WebView添加到WindowManager的参数
int flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
flags,
PixelFormat.TRANSLUCENT);
我已将setLayerType设置为WebView为LAYER_TYPE_HARDWARE。以下是WebView的设置代码
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
AndroidInterface javascriptInterface = new AndroidInterface(this);
webView.addJavascriptInterface(javascriptInterface, "AndroidFunction");
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
我也试过关闭应用程序的硬件加速,但WebView需要它来播放视频。
我已经加载了Youtube视频,没有使用他们的IFrame API,我也遇到了同样的问题。
如果我加载了Vimeo视频,这就是插播,问题不会发生。
问题出现在Nexus 5(Android版本6.0.1)中,但它不会出现在三星Galaxy S3 mini(Android版本4.2.2)中。这使我认为该问题与Chromium有关,因为WebView在所有4.4之前的设备上使用WebKit,并且不使用Chromium。
以前有人遇到过这个问题吗?任何想法都会有用!
提前致谢。
答案 0 :(得分:0)
最后,我找到了解决此问题的方法。我在另一个进程中声明了该服务(在Android Manifest文件中指定了android:process属性)。两个服务之间的通信必须使用与Messenger的IPC(Android进程间通信)来完成。