我正在开发一个带有浮动WebView的Android应用程序,该应用程序使用Youtube的IFrame API播放Youtube视频。浮动视图作为服务实现,当用户浏览应用程序的不同活动时,它始终处于打开状态,当应用程序最小化时,它也浮动。
现在的问题是,当视图组件在活动中呈现时,视频的声音滞后或卡顿。这是我完成的故障排除:
-
我做了两个简单的活动,后面没有网络工作,只是布局中的一堆按钮。当您导航到这些活动或返回时,声音会被中断一秒钟或更长时间。
-
我已经在我的应用程序和 Web 视图上设置了硬件加速属性。这些是我用来将WebView添加到窗口管理器的参数
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 设置为 Web View 作为LAYER_TYPE_HARDWARE。以下是 Web 视图的设置代码
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。
以前有人遇到过这个问题吗?任何想法都会有用!
提前谢谢。
我找到了解决此问题的方法。我在另一个进程中声明了该服务(在 Android 清单文件中指定 android:process 属性)。两个服务之间的通信必须使用IPC(Android Interprocess Communication)和Messenger来完成。