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
相关产品推荐
相关产品推荐

