【发布时间】:2016-04-26 07:57:28
【问题描述】:
我正在开发一个带有浮动 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); -
我已将 webView 的 setLayerType 设置为 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。
以前有人遇到过这个问题吗?任何想法都会很有用!
提前致谢。
【问题讨论】:
标签: android webview youtube chromium