Android WebView如何从外部存储获取文件供JavaScript侧fetch调用
问题解答
问题1:如何验证文件已正常创建、且该路径可以被WebView正常fetch访问?
你遇到的fetch返回404报错,核心原因是直接传入本地绝对路径时,WebView默认将其识别为当前H5页面域名下的相对路径,发起了网络请求,返回的是你后端服务的404响应,和本地文件是否存在无关。
第一步:验证本地文件创建正常
- 在Java侧写入文件完成后,调用
file2.exists()判断文件是否存在,再调用file2.length()打印文件大小,和原始zip文件大小对比,确认读写无异常。 - 打开安卓系统文件管理器,进入应用对应目录
/storage/emulated/0/Android/data/com.example/files/Download,手动确认file2.zip存在且大小匹配。
第二步:配置WebView权限并验证访问
首先需要在Java侧开启WebView的本地文件访问权限:
WebSettings webSettings = webView.getSettings(); // 允许访问本地文件 webSettings.setAllowFileAccess(true); // 若H5是本地file协议加载,开启跨源访问权限 webSettings.setAllowFileAccessFromFileURLs(true); webSettings.setAllowUniversalAccessFromFileURLs(true);
传给JS的路径必须拼接file://前缀,最终格式为file:///storage/emulated/0/Android/data/com.example/files/Download/file2.zip,此时调用fetch才会识别为读取本地文件。
验证时可在H5侧新增测试代码,打印fetch返回的blob.size,和文件实际大小对比即可确认是否读取成功。
问题2:如何直接获取选中的原始文件的真实路径,无需读写复制文件即可供JS侧fetch调用?
安卓从4.4版本开始,系统文件选择器返回的URI均为Content Provider格式(即你拿到的/document/msf:12858),官方已经不推荐获取原始真实路径,部分场景下(比如用户选择云盘、下载管理器内的文件)也无法获取到真实路径。
无需复制文件的最优方案是直接使用Content URI访问,操作步骤如下:
- 先在Java侧开启WebView的Content URI访问权限:
WebSettings webSettings = webView.getSettings(); webSettings.setAllowContentAccess(true);
- 在onActivityResult中直接将拿到的URI转为
content://开头的字符串:
String contentUri = uri.toString(); // 输出格式为content://media/external/file/xxx
- 直接将该contentUri传给JS调用fetch即可,不需要转真实路径,也不需要复制文件,可适配所有安卓版本和文件选择场景。
注意:Android 13及以上版本需要先申请对应存储权限,才可以正常访问Content URI。
内容的提问来源于stack exchange,提问作者Avner Moshkovitz
相关产品推荐
相关产品推荐

