我正在尝试在WebView中加载iFrame。视频/ iFrame无法可靠加载
这是发生了什么:
当我加载屏幕时,在webview的地方有空白,但是最终视频可能会加载,但是大多数时候它不会加载。但是,如果我锁定屏幕并解锁,视频加载就很好。
我扩展了ChromiumWebClient并记录了以下方法:
onProgressChanged(WebView view, int newProgress) {}
onConsoleMessage(ConsoleMessage consoleMessage) {}
原来,视频下载量达到了80%,因此引发了安全异常,但它似乎确实会在短时间内继续下载并下载100%。
尽管下载了100%,但网络视图未显示视频(播放器)。
但是,如上所述,如果我锁定和解锁屏幕,(现在下载的)视频会正确显示。
iFrame(可以来自任何来源,而不仅仅是vimeo):
“ https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F215269493&url=https%3A%2F%2Fvimeo.com%2F215269493&image=https%3A %2F%2Fi.vimeocdn.com%2Fvideo%2F632188996_1280.jpg&key = 0a5d85b22c79478aa887a7e8061bef56&type = text%2Fhtml&schema = vimeo'width ='525'height ='295'scrolling ='no'frameborder ='0'allowfullscreen>“
网页查看代码:
fun onResume() {
videoWebView.onResume()
}
fun onPause() {
videoWebView.onPause()
}
private fun loadVideo(videoWebView: WebView, iFrame: String) {
videoWebView.setWebViewClient(WebViewClient())
videoWebView.setWebChromeClient(WebChromeClient())
videoWebView.settings.javaScriptEnabled = true
videoWebView.settings.domStorageEnabled = true
videoWebView.settings.loadsImagesAutomatically = true
videoWebView.settings.loadWithOverviewMode = true
videoWebView.loadData(
iFrame,
WebFormatUtil.MIMETYPE_HTML,
WebFormatUtil.ENCODING_UTF8)
}
我确实在清单中启用了hardwareAcceleration和Internet权限
日志抛出以下(2条消息):
I /铬:[INFO:CONSOLE(11)]“不安全的来源不推荐使用deviceorientation事件,将来将取消支持。您应考虑将应用程序切换到安全来源,例如HTTPS。请参见https:/ /缩短网址以获取更多详细信息。”,来源:https://f.vimeocdn.com/p/2.69.8/js/player.js(11)
I /铬:[INFO:CONSOLE(0)]“拒绝加载图像'android-webview-video-poster:default_video_poster / -1316638038331145773',因为它违反了以下内容安全策略指令:” img-src'self'数据:https : //i.vimeocdn.com https://secure-b.vimeocdn.com https://f.vimeocdn.com https://vimeo.com https://secure.gravatar.com https:// i0.wp.com https://i1.wp.com https://i2.wp.com https://player.vimeo.com https://*.ci.vimeows.com https://f.vimeocdn .com “。”,来源:https://player.vimeo.com/video/215269493(0)
事实证明这是Chromium客户端中的已知问题,尚未解决。
我正在寻找的是:我正在寻找一种方式,使我在打开屏幕时就可以显示视频,而不必打开和关闭屏幕。除了黑客入侵之外,不确定是否有其他可能。
注意:我尝试了许多其他答案,其中大多数都处理其他问题,例如config等。我已将问题隔离在用于Android WebView的ChromiumClient中,而其他答案则无关。
这是我解决问题的方式:
private fun loadVideo(videoWebView: WebView, iFrame: String) {
webView.setWebChromeClient(object: WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
if (consoleMessage.messageLevel() == ConsoleMessage.MessageLevel.ERROR) {
webView.onResume()
}
return super.onConsoleMessage(consoleMessage)
}
})
//......rest of the method like before
}
每次锁定/解锁屏幕后,视频都会正常显示。这意味着onPause()
和onResume()
被在webView内部触发。
此外,每次发生安全异常时onConsoleMessage(consoleMessage: ConsoleMessage)
,Chromium客户端都会使用标签ERROR触发。
到目前为止,从我的测试来看,这是很安全的。在解决实际问题之前,这对我有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句