1. WebView加载网页https调用http出错
项目报错:
"Mixed Content: The page at 'https://wx.vzan.com/live/tvchat-427320897?v=637539910901869888#/' was loaded over HTTPS,
but requested an insecure video 'http://i3.vzan.cc/m3u8/20200221/a487a8d9b2164043bb632165a0cc129c/v.f24306.m3u8'.
This request has been blocked; the content must be served over HTTPS.",
source: https://wx.vzan.com/live/tvchat-427320897?v=637539910901869888#/ (0)
错误分析:
安卓上从9.0(API level28)开始,明文通信支持默认是被禁用的,官方说法是不安全。因为我们播放的视频源是http协议,所以无法播放。
思路1:添加 usesCleartextTraffic
指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。
<!--Android9.0视频播放功能-->>
<application
android:usesCleartextTraffic="true"
>
</application>
修改后仍有部分机型不可行。
思路2:Android 接入X5WebView
比较好的文章链接:https://www.cnblogs.com/cuichen16/p/10785945.htm
添加后,高版本的手机,Android 10.0以上不可行
思路3:setMixedContentMode
//允许跨域
webSetting.setAllowFileAccessFromFileURLs(true);
webSetting.setAllowUniversalAccessFromFileURLs(true);
webSetting.setSupportMultipleWindows(true);
if (Build.VERSION.SDK_INT >= 21) {
webSetting.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // 此句至关重要,添加后即可
}
最终是添加了上述三个内容以后,最后那一步走完可以了,如果不可以,请继续百度,坚持寻找关键代码。
2. Android 9.0及以上版本中,关于多进程问题对于WebView的影响
“Android P 以及之后版本不支持同时从多个进程使用具有相同数据目录的WebView”
报错信息:
Caused by: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377 : Current process com.example.z(pid 14169), lock owner com.example.z(pid 13739)
解决方案如下:
//Android P行为变更,不可多进程使用同一个目录webView,需要为不同进程webView设置不同目录
@RequiresApi(api = 28)
public void webviewSetPath(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
String processName = getProcessName(context);
String packageName = this.getPackageName();
if (!packageName.equals(processName)) {//判断不等于默认进程名称
WebView.setDataDirectorySuffix(processName);
}
}
}
public String getProcessName(Context context) {
if (context == null) return null;
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == android.os.Process.myPid()) {
return processInfo.processName;
}
}
return null;
}
PS:上述 webviewSetPath 方法记得在应用初始化中调用,最好是在onCreate 中早于第三方初始化调用,否则会出现不起作用。