正在获取java.lang.SecurityException:不支持的路径.但我在请求许可



我正在使用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_EEXTERNAL_STORAGE、READ_EXTERNAL_TORAGE中拥有我的权限,我使用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/…,但不适用于/sttorage/emulized/0/Andrio/obb/otherPackageName/…(

感谢您的阅读,如果您需要任何信息,请告诉我。

我直接将文件存储在包的目录之外,而在DownloadManager内部引发了异常。所以我开始将文件存储在";本地";目录,然后手动将其移动到我想要的目录。

您可以看到移动文件的示例方法的答案:https://stackoverflow.com/a/11327789/13416944

由于我仍在使用Environment.getExternalFilesDirectory((,而这并不是在这些较新的API中实现这一目标的最佳方法,因此一旦我找到更好的解决方案,我希望能编辑这个答案

我在10以上的androids版本中遇到了这个错误,但在较低的版本中一切都很好。对于android 10以上版本,我通过为下载管理器指定子路径来解决这个问题,对于版本10及以上版本来说似乎是必要的:

var request = DownloadManager.Request(uri)
var filename = "MyApp" + imageId + "_.jpg"
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES,"your-sub-path")

请注意,子路径是下载文件的名称,例如:landschaft.jpg

**不要忘记添加运行时Persmission:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

相关内容

  • 没有找到相关文章