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

cordovaFileTransfer下载报错:找不到证书路径信任锚(Android7.0异常)

解决Android 7.0上$cordovaFileTransfer报错Code 3的问题

首先明确你遇到的错误:Code 3对应FileTransferError.FILE_NOT_FOUND_ERR,这个错误通常指向两个核心问题——要么源视频URL无法被Android设备正常访问,要么目标文件路径不存在/APP没有写入权限。结合你iOS正常、Android 6.x之前正常的情况,大概率是Android 7.0系统的权限或路径处理逻辑变化导致的,下面是具体的排查和解决步骤:

1. 修正目标文件路径的获取方式

你当前硬编码的目标路径file:///data/user/0/com.pliablepixels.zmninja_pro/files/temp-video.mp4在Android 6.x有效,但Android 7.0对内部存储的路径解析有更严格的规范,建议直接使用cordova-plugin-file提供的标准化路径常量,避免硬编码带来的适配问题:

// 用cordova.file.dataDirectory获取APP内部存储的正确路径
var targetPath = cordova.file.dataDirectory + 'temp-video.mp4';

这个常量会自动适配不同Android版本的内部存储路径,从根源上避免路径解析错误。

2. 检查APP的文件写入权限

虽然内部存储理论上APP默认拥有读写权限,但Android 7.0强化了权限校验逻辑,建议做以下检查:

  • 确保AndroidManifest.xml中包含必要的权限声明(如果涉及外部存储则需要,内部存储可跳过,但添加也不会有问题):
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • 如果你需要写入外部存储,建议用cordova-plugin-android-permissions动态申请权限(Android 6.0+要求动态申请危险权限,7.0延续了这个机制):
    var permissions = cordova.plugins.permissions;
    permissions.checkPermission(permissions.WRITE_EXTERNAL_STORAGE, function(status) {
      if (!status.hasPermission) {
        permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, function() {
          // 权限申请成功后再执行文件下载
        }, function() {
          // 权限申请失败,提示用户开启对应权限
        });
      }
    });
    

3. 排查源URL的访问问题

虽然iOS可以正常访问,但Android 7.0的网络安全配置可能拦截了请求:

  • 先在Android设备的浏览器中打开你的源URL https://server/zm/index.php?view=view_video&eid=218648,确认能正常下载视频,排除服务器端或网络环境问题。
  • 如果你的服务器使用的是自签名HTTPS证书,Android 7.0默认会拒绝信任,需要在res/xml/network_security_config.xml中配置信任该证书,或者临时开启trustAllHosts参数测试(注意生产环境不建议使用该参数,存在安全风险):
    $cordovaFileTransfer.download(sourceUrl, targetPath, {}, true) // 第四个参数设为true开启信任所有主机
      .then(function(result) {
        // 下载成功逻辑
      }, function(error) {
        console.error('下载失败:', error);
      });
    

4. 升级或替换插件版本

你使用的cordova-plugin-file-transfer 1.7.1是比较老旧的版本(该插件已被官方标记为废弃,推荐使用Fetch API或cordova-plugin-file的原生文件操作),可能对Android 7.0的适配存在遗留问题:

  • 尝试升级到该插件的最后稳定版本(比如1.7.5),同时确保cordova-plugin-file版本也同步升级以保证兼容性。
  • 长远来看,建议替换为更现代的下载方式,比如用Fetch API配合cordova-plugin-file写入文件,示例代码:
    fetch(sourceUrl)
      .then(response => response.blob())
      .then(blob => {
        window.resolveLocalFileSystemURL(cordova.file.dataDirectory, function(dir) {
          dir.getFile('temp-video.mp4', { create: true }, function(file) {
            file.createWriter(function(writer) {
              writer.write(blob);
              writer.onwriteend = function() {
                // 文件写入完成,执行后续逻辑
              };
            });
          });
        });
      });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:52:54