Android11(SDK30)下WebView无法加载应用专属目录HTML文件求助
问题根因
你遇到的问题并非应用专属目录的读写权限问题,本质是Android 11(API 30)对WebView的运行策略和进程隔离机制做了升级,导致原有配置失效:
- API 30起WebView的
setAllowFileAccess配置默认值从true改为false,默认禁止加载本地file协议资源 - WebView渲染进程与宿主应用进程的隔离度提升,宿主对应用专属目录的权限默认不会共享给WebView进程,未设置全局可读的文件会被WebView拦截
- file协议的同源策略校验更严格,HTML内JS读取同目录下的音频、GeoJSON等资源默认会被判定为跨源禁止
解决步骤
1. 显式配置WebView权限
在WebView初始化时添加以下配置:
WebSettings webSettings = webView.getSettings(); // 允许访问本地文件 webSettings.setAllowFileAccess(true); // 允许file协议的JS读取其他本地文件 webSettings.setAllowFileAccessFromFileURLs(true); webSettings.setAllowUniversalAccessFromFileURLs(true); // 确保JavaScript已启用 webSettings.setJavaScriptEnabled(true);
2. 下载文件时设置全局可读权限
所有下载到应用专属目录的HTML、音频、GeoJSON文件,下载完成后要设置全局可读权限,确保WebView进程可以访问:
// 下载完成后对目标文件设置可读权限 File targetFile = new File(yourFilePath); targetFile.setReadable(true, false); // 第二个参数传false表示所有进程都可读,而非仅当前应用进程
3. 修正HTML加载路径
传入WebView的路径必须带file://协议头,不要直接传入文件绝对路径:
// 错误写法 // webView.loadUrl(htmlFile.getAbsolutePath()); // 正确写法 webView.loadUrl("file://" + htmlFile.getAbsolutePath());
排查辅助
如果修改后仍有问题,添加WebView错误回调打印具体报错信息:
webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); // 打印错误信息,判断是权限问题还是资源不存在 Log.e("WebViewError", error.getDescription().toString()); } }); webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { // 打印JS控制台报错,可定位音频/GeoJSON加载失败的具体原因 Log.d("WebViewConsole", consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId()); return super.onConsoleMessage(consoleMessage); } });
内容的提问来源于stack exchange,提问作者piolay
相关产品推荐
相关产品推荐

