【问题标题】:Getting java.lang.SecurityException: Unsupported path. But I am asking for permissions获取 java.lang.SecurityException:不支持的路径。但我要求权限
【发布时间】: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


【解决方案1】:

我直接将文件存储在我的包目录之外,并且在 DownloadManager 中引发了异常。 所以我开始将文件存储在“本地”目录中,然后手动将其移动到我想要的目录中。

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

由于我仍在使用 Environment.getExternalFilesDirectory(),而这并不是在这些较新的 API 中执行此操作的最佳方法,因此希望在找到更好的解决方案后编辑此答案

【讨论】:

  • 嗨,我也有同样的问题。有没有其他方法可以解决?谢谢
  • 嗨。恐怕我没有找到其他方法。对于Android R,我认为不可能直接对应用范围之外的目录执行此操作。
  • 如果你想在 Android R 及以上版本中打开文件,也许this。它需要向用户请求许可。在新的 android 版本中不再有无限制(-ish)文件访问之类的东西,从安全角度来看,这显然是好的;只是认为没有足够的文档。
【解决方案2】:

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

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

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

** 不要忘记添加运行时权限:

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

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多