一、net::ERR_UNKNOWN_URL_SCHEME
见:https://blog.csdn.net/qugengting/article/details/85129831
二、设置跨域:
try {
if (Build.VERSION.SDK_INT >= 16) {
Class<?> clazz = webSetting.getClass();
Method method = clazz.getMethod(
"setAllowUniversalAccessFromFileURLs", boolean.class);//利用反射机制去修改设置对象
if (method != null) {
method.invoke(webSetting, true);//修改设置
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
三、https访问http图片失败或是反过来:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSetting.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
四、这个其实是整个android9.0以上的网络访问问题:不允许直接访问Http:
新增xml文件夹,新增network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后AndroidManifest.xml当中,application设置:android:networkSecurityConfig="@xml/network_security_config"
五、A WebView method was called on thread 'JavaBridge'. All WebView methods must be called...
这个问题发现Android 9以上会出现,解决方法是"@JavascriptInterface"注解的方法必须指定在UI线程执行,将原来方法里的代码放入run里面执行:
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
//TODO
}
});
基本设置:
protected void initWebView() {
webView.getSettings().setJavaScriptEnabled(true);
// webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
//优先使用网络
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
//将图片调整到适合webview的大小
webView.getSettings().setUseWideViewPort(true);
//支持内容重新布局
webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//支持自动加载图片
webView.getSettings().setLoadsImagesAutomatically(true);
//当webview调用requestFocus时为webview设置节点
webView.getSettings().setNeedInitialFocus(true);
//自适应屏幕
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
//开启DOM storage API功能(HTML5 提供的一种标准的接口,主要将键值对存储在本地,在页面加载完毕后可以通过 javascript 来操作这些数据。)
webView.getSettings().setDomStorageEnabled(true);
//支持缩放
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
//允许webview对文件的操作
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
webView.requestFocusFromTouch();
}
设置返回键效果:
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { // 表示按返回键时的操作
webView.goBack(); // 后退
// webview.goForward();//前进
return true; // 已处理
}
}
return false;
}
});
跳转会弹出浏览器APP选择框:
解决方法:添加setWebViewClient监听事件:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//webView.loadUrl(url);
//return true;
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return true;
}
});