Android踩坑记录:部分网站在WebView上播放视频会重复播放

前几天在项目运行中发现 我们的项目 Web View 在部分网站播放视频 老是播着播着就回到卡住然后从头开始播放 一直循环


首先是把无法播放的网址使用浏览器和 pc 进行实验 发现是正常的


  1. 第一个想到的是会不会 http 的问题 因为 Android 5 . 0 以上混用 http https 需要另外设置 但是检查后发现我们已经设置了 而且现在的问题是对于 http 读取的问题而不是无法读取

  2. 第二个在想会不会是证书问题 随后在 onReceivedSslError 中进行处理发现根本没走到里面

  3. 第三个考虑到会不会是 UA 的问题 那个网址对我们的 UA 进行拦截了 更换 UA 发现也不起作用

  4. 第四个考虑到会不会是我们对于网页的广告拦截操作,误拦截了相关的逻辑 在把网站加入白名单后发现还是存在问题

没有头绪的时候,把项目放在那2个小时去忙别的事情,回过头来 突然发现 网站中的当前时间一直在 2 个小时前 很像是被缓存后的结果 查看代码发现 之前的项目工程师把缓存设置为 LOAD_CACHE_ONLY 也就是默认强制读取本地缓存。

再去查看无法播放视频的网站 发现他们的 ts 像是在线生成的。 例如读取ts 001.ts 然后002.ts 直到100.ts 读取一圈后又回到001.ts 加上这个缓存设置 就会默认读取上一次缓存下来的001.ts

解决方案 设置 it.cacheMode = WebSettings.LOAD_DEFAULT 即可


简单归纳一下几个模式的区别

  • LOAD_DEFAULT: 默认,根据 cache-control 决定是否从网络上取数据

  • LOAD_NORMAL: API level 17 中已经废弃, 从API level 11开始作用同 LOAD_DEFAULT 模式

  • LOAD_CACHE_ELSE_NETWORK: 只要本地有,无论是否过期,或者 no-cache,都使用缓存中的数据

  • LOAD_NO_CACHE: 不使用缓存,只从网络获取数据

  • LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据


请使用浏览器的分享功能分享到微信等