MAUI Android WebView无法加载本地网页问题求助
问题描述
应用下载的网页文件mydownloadedpage.html存储路径为/data/user/0/com.xyx.qwerty/files/storage/mydownloadedpage.html,iOS端WebView可正常加载,但Android端直接传入完整路径到WebView的Source属性时,触发ERR_ACCESS_DENIED错误。
当前使用的WebView代码:
<WebView Source="/data/user/0/com.xyx.qwerty/files/storage/mydownloadedpage.html"/>
已尝试的配置:
- 在
AndroidManifest.xml中添加存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 添加
android:usesCleartextTraffic="true"配置
上述操作未解决问题,需实现Android端WebView正常加载该本地网页。
解决方法
1. 补充file:///协议前缀
Android WebView加载本地文件必须明确指定file:///协议,直接传绝对路径会被WebView的安全机制拦截。修改Source属性:
<WebView Source="file:///data/user/0/com.xyx.qwerty/files/storage/mydownloadedpage.html"/>
2. 开启WebView本地文件访问权限
针对Android 11及以上版本,即使应用拥有存储权限,WebView默认限制访问应用私有目录文件。需在WebView设置中开启相关权限:
WebSettings webSettings = webView.getSettings(); webSettings.setAllowFileAccess(true); webSettings.setAllowFileAccessFromFileURLs(true); // 允许从本地文件URL加载关联资源(如CSS、JS) webSettings.setAllowUniversalAccessFromFileURLs(true);
注:如果使用React Native、Flutter等跨平台框架,需对应配置框架WebView组件的参数开启上述权限。
3. 使用FileProvider共享私有目录文件(推荐适配Android 10+)
Android 10及以上的分区存储机制,直接访问应用私有目录文件易触发权限限制,建议通过FileProvider生成Content URI加载:
- 在
AndroidManifest.xml注册FileProvider:
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.xyx.qwerty.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
- 在
res/xml/file_paths.xml定义文件路径映射:
<?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="storage" path="storage/" /> </paths>
- 通过FileProvider获取Content URI并加载:
File localFile = new File(getFilesDir(), "storage/mydownloadedpage.html"); Uri contentUri = FileProvider.getUriForFile(this, "com.xyx.qwerty.fileprovider", localFile); webView.loadUrl(contentUri.toString());
4. 清理冗余权限配置
你的文件存储在应用私有目录/data/user/0/.../files/下,该目录属于应用默认可访问范围,无需申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限(Android 10+这些权限对私有目录无效),可从AndroidManifest.xml中移除这两个权限声明。
内容的提问来源于stack exchange,提问作者Isidoros Moulas

