Android 11 作用域存储下Cordova读取图片提示不存在如何解决
Android 11 Cordova读取应用沙箱图片不存在问题解决方案
问题复现代码
window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, function success(dirEntry) { dirEntry.getFile(value, { create: false, exclusive: false }, function fileExist(fileEntry){ element.attr('src', fileEntry.toURL()); }, function fileDoesNotExist(){ alert('Image not found' + value); }); }, function fail(evt) { alert('error: ' + evt.target.error.code); } );
可能的问题原因
- 路径不匹配:首先确认你存储图片时用的目录和读取时的
cordova.file.cacheDirectory是否完全一致。Android 11对Cordova的存储路径映射做了调整,很多开发者存储时用的是cordova.file.externalCacheDirectory、cordova.file.dataDirectory等其他沙箱路径,读取时选错目录自然找不到文件。 - 文件名大小写不匹配:Android沙箱文件系统大小写敏感,你传入的
value参数的文件名大小写必须和实际存储的完全一致,例如实际文件是Avatar.png的话,传avatar.png会直接判定文件不存在。 - Cordova文件插件版本未适配系统版本:低于v6.0.0版本的
cordova-plugin-file没有完全兼容Android 11的分区存储规则,如果你的App targetSdkVersion >=30,需要将插件升级到v7.0以上版本,否则会出现路径解析错误。 - 参数包含非法路径前缀:如果
value参数不是单纯的文件名,而是带了子目录的相对路径,需要确保对应的父目录已经提前创建,getFile默认不会自动创建父目录,父目录不存在时也会触发文件不存在的回调。
排查建议
- 先在存储文件和读取文件的位置分别打印对应目录的绝对路径,确认二者路径完全一致
- 先写死一个确认存在的文件名传入
value测试,排除参数传递错误的问题 - 把失败回调的错误码完整打印出来对照定位:错误码1代表文件/路径不存在,错误码3代表找不到对应父目录
内容的提问来源于stack exchange,提问作者user3907580
相关产品推荐
相关产品推荐

