Android WebView中运行的JavaScript如何读取本地磁盘存储的txt文件
问题根因
你当前WebView加载的页面源为https://appassets.androidplatform.net(HTTPS协议),待请求的txt文件使用file://协议,二者属于不同源,WebView遵循的浏览器同源策略默认禁止跨协议请求资源,因此触发Fetch API的报错。
本地加载场景解决方案
方案1:调整WebView安全配置(仅测试环境推荐)
在原生层WebView初始化时添加如下配置,放开跨域和文件访问限制:WebSettings webSettings = webView.getSettings(); // 开启基础权限 webSettings.setJavaScriptEnabled(true); webSettings.setAllowFileAccess(true); // 放开跨源访问限制(安卓4.1及以上生效) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setAllowFileAccessFromFileURLs(true); }注意:该方案会降低WebView安全性,生产环境不建议使用。
方案2:通过JSBridge桥接原生读取文件(生产环境推荐)
原生侧实现本地文件读取逻辑,通过JavascriptInterface暴露给JS调用,完全规避跨域问题:- 原生层绑定接口到WebView:
// 自定义JS交互接口类 public class JsInterface { @JavascriptInterface public String readMyTextFile() { // 此处实现读取指定路径txt文件的逻辑,返回文件内容字符串 File txtFile = new File(getExternalFilesDir("www"), "mytextfile.txt"); // 省略文件读取代码,最终返回内容字符串 return fileContent; } } // 绑定接口到WebView webView.addJavascriptInterface(new JsInterface(), "AndroidBridge");- JS侧直接调用接口获取内容:
const fileContent = window.AndroidBridge.readMyTextFile(); doStuffOnDiskTxtFile(fileContent); // 直接处理拿到的文件内容即可该方案安全性可控,原生侧可限制仅允许读取指定路径的文件,无权限泄露风险。
方案3:映射本地文件到同域HTTPS路径
拦截WebView的资源请求,将https://appassets.androidplatform.net/files/mytextfile.txt这类同域请求映射到本地存储的txt文件,JS侧直接请求同域路径即可,无需修改安全配置。
远端部署是否可规避问题
不能。
如果将HTML+JS部署到远端服务器,页面源为远端HTTPS域名,依然和本地file://协议的文件跨源,同源策略仍会拦截请求,且远端页面访问本地文件的权限限制更严格,实现难度更高。除非你将生成的txt文件也上传到远端服务器同一路由下,才可以直接通过Fetch请求,但不符合本地生成文件本地处理的需求。
内容的提问来源于stack exchange,提问作者toto_tata
相关产品推荐
相关产品推荐

