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

Cordova background-download插件Android13路径错误问题求解决办法

Android 13下cordova-plugin-background-download路径问题解决办法

问题根源

Android 13(API 33)开始,Environment.getExternalStorageDirectory()被正式废弃,且系统严格限制了对公共存储根目录的直接访问权限,插件原有代码依赖该方法生成路径,自然会触发"Unsupported path"错误。

具体解决步骤

1. 修改插件内部的临时文件路径生成逻辑

你需要修改插件的Java代码(对应报错的那段),替换掉失效的路径获取方式,推荐两种方案:

方案一:使用应用专属外部存储目录(无需额外权限)

这个目录属于应用私有空间,卸载应用时会自动删除,不需要申请存储权限:

// 获取应用专属外部存储目录
File appExternalDir = context.getExternalFilesDir(null);
// 生成临时文件名
String tempFileName = Uri.parse(targetFileUri).getLastPathSegment() + "." + System.currentTimeMillis();
// 创建临时文件
File tempFile = new File(appExternalDir, tempFileName);
// 设置临时文件Uri
this.setTempFileUri(Uri.fromFile(tempFile).toString());
方案二:使用公共媒体目录(需配置权限)

如果需要将文件下载到公共目录(比如Downloads),必须通过MediaStore来获取合法Uri,不能直接创建File对象:

String tempFileName = Uri.parse(targetFileUri).getLastPathSegment() + "." + System.currentTimeMillis();

// 构建MediaStore参数
ContentValues values = new ContentValues();
values.put(MediaStore.Downloads.DISPLAY_NAME, tempFileName);
values.put(MediaStore.Downloads.MIME_TYPE, "application/octet-stream");
values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

// 插入到MediaStore获取Uri
Uri tempUri = context.getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
this.setTempFileUri(tempUri.toString());

注意:使用该方案时,后续写入文件需要通过ContentResolver.openOutputStream(tempUri)操作,不能直接用File的流写入。

2. 配置Android权限

如果选择方案二(公共目录),需要在AndroidManifest.xml中添加对应权限:

<!-- Android 13+ 媒体访问权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- Android 12及以下需要WRITE权限,限制最高SDK版本为32 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

同时在JavaScript代码中动态申请权限(需依赖cordova-plugin-android-permissions插件):

async function requestStoragePermissions() {
  if (cordova.platformId !== 'android') return;
  
  const requiredPermissions = [
    'android.permission.READ_MEDIA_IMAGES',
    'android.permission.READ_MEDIA_VIDEO',
    'android.permission.READ_MEDIA_AUDIO'
  ];
  
  try {
    const status = await cordova.plugins.permissions.requestPermissions(requiredPermissions);
    if (!status.hasPermission) {
      throw new Error('用户拒绝了媒体访问权限');
    }
  } catch (err) {
    console.error('权限申请失败:', err);
  }
}

// 在下载前调用权限申请
requestStoragePermissions();

3. 更新Cordova配置

确保config.xml中Android的目标SDK版本设置为33或更高:

<platform name="android">
  <preference name="android-targetSdkVersion" value="33" />
</platform>

4. 重新编译测试

修改完插件代码和配置后,执行以下命令重新编译项目:

cordova clean android
cordova build android

在Android 13设备上测试下载功能,确认路径错误已解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:01:43