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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:18:45