由于违反安全策略,WebView 不加载 iFrame 视频
WebView doesn't load iFrame video due to security policy violation
我正在尝试在我的 WebView 中加载 iFrame。
video/iFrame 加载不可靠
事情是这样的:
当我加载屏幕时,在 webview 的地方有空白 space,但最终视频可能会加载,但大多数时候,它不会加载。
但是,如果我锁定屏幕然后解锁,视频加载会很好。
我扩展了 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/chromium: [INFO:CONSOLE(11)] "The deviceorientation event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://shortened url for more details.", source: https://f.vimeocdn.com/p/2.69.8/js/player.js (11)
I/chromium: [INFO:CONSOLE(0)] "Refused to load the image 'android-webview-video-poster:default_video_poster/-1316638038331145773' because it violates the following Content Security Policy directive: "img-src 'self' data: 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".
", source: https://player.vimeo.com/video/215269493 (0)
这原来是 Chromium 客户端中的一个 known issue 并且尚未修复。
我要找的是:
我正在寻找一种方式,当我打开屏幕时,无需打开和关闭屏幕即可显示视频。
不确定除了破解之外是否还有其他可能。
注意:我已经尝试了很多其他答案,大部分都是处理其他问题,比如配置等等。
我已经将问题隔离在用于 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
}
每次 lock/unlocking 屏幕后,视频显示正常。
这意味着 onPause()
和 onResume()
在 webView 中触发。
此外,每次发生安全异常时,Chromium 客户端中的 onConsoleMessage(consoleMessage: ConsoleMessage)
都会被触发并带有错误标记。
根据我的测试,这是一个黑客攻击,到目前为止是安全的。
在解决实际问题之前,这对我有用。
我正在尝试在我的 WebView 中加载 iFrame。 video/iFrame 加载不可靠
事情是这样的:
当我加载屏幕时,在 webview 的地方有空白 space,但最终视频可能会加载,但大多数时候,它不会加载。 但是,如果我锁定屏幕然后解锁,视频加载会很好。
我扩展了 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/chromium: [INFO:CONSOLE(11)] "The deviceorientation event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://shortened url for more details.", source: https://f.vimeocdn.com/p/2.69.8/js/player.js (11)
I/chromium: [INFO:CONSOLE(0)] "Refused to load the image 'android-webview-video-poster:default_video_poster/-1316638038331145773' because it violates the following Content Security Policy directive: "img-src 'self' data: 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". ", source: https://player.vimeo.com/video/215269493 (0)
这原来是 Chromium 客户端中的一个 known issue 并且尚未修复。
我要找的是: 我正在寻找一种方式,当我打开屏幕时,无需打开和关闭屏幕即可显示视频。 不确定除了破解之外是否还有其他可能。
注意:我已经尝试了很多其他答案,大部分都是处理其他问题,比如配置等等。 我已经将问题隔离在用于 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
}
每次 lock/unlocking 屏幕后,视频显示正常。
这意味着 onPause()
和 onResume()
在 webView 中触发。
此外,每次发生安全异常时,Chromium 客户端中的 onConsoleMessage(consoleMessage: ConsoleMessage)
都会被触发并带有错误标记。
根据我的测试,这是一个黑客攻击,到目前为止是安全的。 在解决实际问题之前,这对我有用。