Android 11 WebView 打开html文件,加载时报错:ERR_ACCESS_DENIED

问题描述:
之前andorid 10上做的需求,移植到android 11上

在项目中,system/app/HTMLViewer/ 自定义的加载html的xxxActivity.java文件访问 手机系统中的

/system/etc/ *.html 文件时, 加载时报错:ERR_ACCESS_DENIED

原因分析:
Android 11 上面 WebSettings.setAllowFileAccess(boolean allow) 方法说明:

The default value is {@code true} for apps targeting *

{@linkandroid.os.Build.VERSION_CODES#Q} and below,

and {@code false} when targeting

* {@link android.os.Build.VERSION_CODES##R} and above.

1. 在Android 10及以下版本,这个值默认是为true的, android 11 以上默认为false。

Enables or disables file access within WebView. * Note that this enables or disables file system access only. Assets and resources are still accessible using file:///android_asset and file:///android_res.

2. 在 WebView 中启用或禁用文件访问。请注意,这仅启用或禁用文件系统访问。 assert 和 res
仍然可以使用 file:///android_asset 和 file:///android_res 访问。

3. android 11 上面google出于安全考虑,不推荐用webview直接访问文件,如果实际项目中有需要,就需要设置为true

解决方案:
WebSettings.setAllowFileAccess(true)

从Android4.2开始。 只有添加 @JavascriptInterface 声明的Java方法才可以被JavaScript调用, 例如:

class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
}

webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");

 

 所有的WebView方法都应该在同一个线程程中调用,而这里的contactlist方法却在 JavaBridge线程中被调用了!所以我们要要把contactlist里的东东写到同一个线程中,比如一种解决 方法,就是下面这种:

 

posted @ 2022-11-24 15:41  herry507  阅读(965)  评论(0编辑  收藏  举报