Cordova Android端FileReader.readAsDataURL报NOT_FOUND_ERR问题求助
解决Android端Cordova FileReader无法读取Media Capture录制文件的问题
我之前在Android 8+设备上也碰到过一模一样的情况——iOS端录制视频后读取完全正常,Android端却总是报NOT_FOUND_ERR,结合你已经做的排查,我整理了几个核心原因和对应的解决方法:
1. Android 8+的动态权限缺失
虽然你已经在AndroidManifest.xml里添加了读写权限,但Android 6(API 23)及以上要求动态申请危险权限,而cordova-plugin-media-capture本身不会自动处理这个逻辑。你需要借助cordova-plugin-android-permissions插件在录制前主动请求权限:
// 先安装插件:cordova plugin add cordova-plugin-android-permissions const permissions = cordova.plugins.permissions; // 封装录制逻辑到单独函数 function startVideoCapture() { navigator.device.capture.captureVideo((mediaFiles: MediaFile[]) => { // 你的原有处理逻辑... }, (_error: CaptureError) => { console.log(_error); }, { limit: 1, duration: 10, quality: 1 }); } // 录制前检查并申请权限 permissions.checkPermission(permissions.READ_EXTERNAL_STORAGE, (status) => { if (!status.hasPermission) { permissions.requestPermissions( [permissions.READ_EXTERNAL_STORAGE, permissions.WRITE_EXTERNAL_STORAGE], startVideoCapture, (err) => console.error("权限申请失败", err) ); } else { startVideoCapture(); } }, (err) => console.error("权限检查失败", err));
2. Media Capture返回的路径格式不兼容
在Android上,mediaFile.localURL有时会返回file://开头的路径,而不是标准的cdvfile://协议,这会导致resolveLocalFileSystemURL处理异常。你可以手动转换路径格式:
const mediaFile = mediaFiles[0]; let fileUrl = mediaFile.localURL; // 将file://路径转换为cdvfile格式 if (fileUrl.startsWith('file://')) { fileUrl = fileUrl.replace('file://', 'cdvfile://localhost/sdcard/'); } // 再传入resolveLocalFileSystemURL window.resolveLocalFileSystemURL(fileUrl, (fileEntry: Entry) => { // 后续逻辑... }, (_error: FileError) => { console.log(_error); });
3. 改用Cordova File插件的读取方法替代原生FileReader
原生FileReader对cdvfile协议的兼容性不如cordova-plugin-file提供的API可靠,你可以直接用FileEntry自带的readAsDataURL方法:
(fileEntry as FileEntry).readAsDataURL((dataUrl) => { success({ data: dataUrl, type }); }, (_error: FileError) => { console.log(_error); });
4. 重新配置Cordova存储偏好
还原并调整config.xml里的存储相关配置,然后重新构建项目:
<preference name="AndroidPersistentFileLocation" value="Compatibility" /> <preference name="AndroidExtraFilesystems" value="sdcard,documents" /> <access origin="cdvfile://*" />
执行清理和构建命令:
cordova clean android && cordova build android
5. 验证文件路径的真实性
在resolveLocalFileSystemURL成功后,打印文件的真实路径确认是否正确:
window.resolveLocalFileSystemURL(fileUrl, (fileEntry: Entry) => { console.log("文件真实路径:", fileEntry.fullPath); // 示例:/storage/emulated/0/DCIM/Camera/xxx.mp4 (fileEntry as FileEntry).file((file: File) => { console.log("文件对象详情:", file); }); });
如果路径正确但仍无法读取,可能是Android存储沙箱限制,可以尝试将录制的视频复制到APP私有目录后再读取。
内容的提问来源于stack exchange,提问作者a432511
相关产品推荐
相关产品推荐

