问题描述
我正在使用DownloadManager将文件下载到一个目录,该目录不在我的“本地软件包”目录中,即/ storage / emulated / 0 / Android / data / myPackageName /之外,但属于另一个目录的软件包,更多具体来说就是obb目录,/ storage / emulated / 0 / Android / obb / otherPackageName /
如果我安装在“我的软件包目录”上,没问题,如果我不在软件包目录中,则会收到“ java.lang.SecurityException:不支持的路径/ storage / emulated / 0 / Android / obb / otherPackageName / fileName”。 obb”
我在android清单WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE中具有我的权限,并且我使用ContextCompat.checkSelfPermission检查是否拥有它们,并查看它是否等于PackageManager.PERMISSION_GRANTED。但是,如果没有,并且对于API level> = 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 /...)
感谢您的阅读,让我知道您是否需要任何信息。
解决方法
我直接将文件存储在包的目录之外,并且在DownloadManager中引发了异常。 因此,我开始将文件存储在“本地”目录中,然后手动将其移动到所需的目录中。
您可以看到以下答案,以获取移动文件的示例方法: https://stackoverflow.com/a/11327789/13416944
由于我仍在使用Environment.getExternalFilesDirectory(),而这并不是在这些较新的API中执行此操作的最佳方法,因此,一旦找到更好的解决方案,希望我会对此答案进行编辑