You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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访问,操作步骤如下:

  1. 先在Java侧开启WebView的Content URI访问权限:
WebSettings webSettings = webView.getSettings();
webSettings.setAllowContentAccess(true);
  1. 在onActivityResult中直接将拿到的URI转为content://开头的字符串:
String contentUri = uri.toString(); // 输出格式为content://media/external/file/xxx
  1. 直接将该contentUri传给JS调用fetch即可,不需要转真实路径,也不需要复制文件,可适配所有安卓版本和文件选择场景。

注意:Android 13及以上版本需要先申请对应存储权限,才可以正常访问Content URI。


内容的提问来源于stack exchange,提问作者Avner Moshkovitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:24:06