【发布时间】:2020-08-18 10:15:20
【问题描述】:
我正在使用 DownloadManager 将文件下载到一个目录,该目录不属于我的“本地包”目录,即在 /storage/emulated/0/Android/data/myPackageName/ 之外,而是另一个目录包的一部分,更多具体来说,obb目录,/storage/emulated/0/Android/obb/otherPackageName/
如果我安装在“我的包的目录”上,没问题,如果我离开它,我会得到一个“java.lang.SecurityException: Unsupported path /storage/emulated/0/Android/obb/otherPackageName/fileName.奥布"
我在 android 清单 WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE 中拥有我的权限,我使用 ContextCompat.checkSelfPermission 检查我是否拥有它们,并查看它是否等于 PackageManager.PERMISSION_GRANTED,它确实如此。但如果没有,并且对于 API 级别>=23,我会使用类似于
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, CODE);
然后我使用 onRequestPermissionsResult() 来检查响应,看看它是否是 PackageManager.PERMISSION_GRANTED,这样我就可以开始下载了。
即使这样,我也遇到了异常。这可以是设备特定的还是 API 特定的?我必须在其他设备和 API 上进行测试才能确定。 我在这里做错了吗?我需要额外的许可吗?目录外必须可以写?
另外,我使用 Environment.getExternalStorageDirectory() 获取外部目录,然后将子目录添加为字符串(适用于 /storage/emulated/0/Android/data/myPackageName/...,但不适用于/storage/emulated/0/Android/obb/otherPackageName/...)
感谢您的阅读,如果您需要任何信息,请告诉我。
【问题讨论】:
-
这一切都在 Android 10 上?此外,您没有显示使用该路径并产生异常的代码。还不清楚您是否已经在下载时遇到了该异常。
-
@blackapps 到目前为止,我只在 android 10 上测试过。我只是将名称类似于上面虚拟名称的文件传递给 DownloadManager 请求,它会在方法 .enqueue(request) 中引发异常。
-
works for /storage/emulated/0/Android/data/myPackageName/...不要以这种方式建立路径。请改用 getExternalFilesDir(()。 -
您不能在 Android 10 上再使用此类路径。只能使用 getFilesDir()、getExternalFilesDir() 和 getExternalFilesDirs()。
-
如果您仍想在 android 10 上使用该路径,请将 legacyExternalStorageDirectory true 添加到清单文件。
标签: java android download-manager securityexception