Android WebView无法播放视频问题及批量修复方案
问题描述
原本正常运行的WebView视频初始化函数,在项目更新后无法播放视频,仅显示iframe字符串内容。排查发现传入的video参数是经过HTML转义的字符串,手动转义回正常HTML即可播放。现有大量页面使用此类字符串,需要一次性修复。
原函数代码:
private fun WebView.initVideo(video: String) { WebViewVideoPlayerUtils.addCookie(video, this) with(settings) { javaScriptEnabled = true domStorageEnabled = true cacheMode = WebSettings.LOAD_NO_CACHE builtInZoomControls = true allowFileAccess = true loadWithOverviewMode = true useWideViewPort = true } loadDataWithBaseURL( null, video, "text/html", "utf-8", null ) }
传入的转义后字符串示例:
<iframe width="853" height="480" src="https://www.youtube.com/embed/_iATsZKqYF0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
AndroidManifest.xml已配置必要权限、android:hardwareAccelerated="true"和android:usesCleartextTraffic="true"。
解决方案
核心是在加载前对HTML转义的字符串进行反转义处理,直接修改initVideo函数即可一次性修复所有调用该函数的页面,无需逐个修改页面数据。
修复后的函数代码
import android.text.Html private fun WebView.initVideo(video: String) { WebViewVideoPlayerUtils.addCookie(video, this) with(settings) { javaScriptEnabled = true domStorageEnabled = true cacheMode = WebSettings.LOAD_NO_CACHE builtInZoomControls = true allowFileAccess = true loadWithOverviewMode = true useWideViewPort = true } // 对转义的HTML字符串进行反转义 val unescapedVideo = Html.fromHtml(video, Html.FROM_HTML_MODE_LEGACY).toString() loadDataWithBaseURL( null, unescapedVideo, "text/html", "utf-8", null ) }
关键说明
- 利用Android系统API
Html.fromHtml()完成HTML反转义:Html.FROM_HTML_MODE_LEGACY适配Android 7.0及以下版本,若项目最低SDK版本高于24(Android 7.0),可替换为Html.FROM_HTML_MODE_COMPACT。 - 该修改仅需调整
initVideo函数,所有调用此函数的页面会自动处理转义字符串,无需修改其他业务逻辑。 - 若需兼容特殊场景,可先判断字符串是否包含HTML转义标记(如
<、")再执行反转义,但全局直接处理已能覆盖绝大多数情况。
内容的提问来源于stack exchange,提问作者Helios
相关产品推荐
相关产品推荐

