【问题标题】:Scoped Storage: getExternalStoragePublicDirectory and setDestinationInExternalPublicDir范围存储:getExternalStoragePublicDirectory 和 setDestinationInExternalPublicDir
【发布时间】:2021-04-23 19:01:04
【问题描述】:

使用 Scoped Storage,getExternalStoragePublicDirectory 已弃用,Android 文档显示

此方法在 API 级别 29 中已弃用。为了提高用户隐私,不建议直接访问共享/外部存储设备。当应用程序以 Build.VERSION_CODES.Q 为目标时,从此方法返回的路径不再可供应用程序直接访问。通过迁移到 Context#getExternalFilesDir(String)、MediaStore 或 Intent#ACTION_OPEN_DOCUMENT 等替代方案,应用可以继续访问存储在共享/外部存储上的内容。

但是setDestinationInExternalPublicDir 并未被弃用。目前我正在使用downloadManager 下载pdf并将其保存在以下载目录为根的文件夹中(通过将目录作为DIRECTORY_DOWNLOADS传递给setDestinationInExternalPublicDir)。然后,我使用已弃用的 getExternalStoragePublicDirectory() 方法创建一个 FILE 对象,并为所有适当的应用程序触发一个意图来处理 PDF 查看。

我的问题是,当我将 requestLegacyExternalStorage 标志设置为 true 时,它​​工作正常(我的目标 sdk 是 29)。但是,当我省略它时,有时它可以正常工作,但有时 PDF 查看器会打开文件然后立即关闭它。我试图在我的应用程序本身中读取文件以查看出了什么问题,但我得到了拒绝访问异常。这是有道理的,因为使用范围存储,getExternalStoragePublicDirectory() 返回不可访问的路径。但是,这种间歇性如何像其他时候正常工作一样?

补充问题,我不明白为什么我的设置 requestLegacyExternalStorage 标志应该有任何效果。我正在做的只是使用DownloadManager 中不推荐使用的setDestinationInExternalPublicDir 方法将pdf 保存到Download 目录中的子文件夹中。然后我创建一个文件(是的,我通过一个已弃用的getExternalStoragePublicDirectory 知道它可能无法访问 - 但我不在乎,因为我没有访问它),从中获取 uri 并触发意图 - 因此行为是否应该不仅仅取决于pdf 查看器应用程序是否可以访问旧文件夹(也就是说,如果它们在 APIrequestLegacyExternalStorage 设置为 true)? - 这只是为了理解这个概念,当然我需要处理它并将其存储在某个可访问的位置。

这带来了我的最后一个问题。为了处理这个问题,我可以选择使用MediaStore.Downloads,它还会在下载目录中下载文件。我还能用DownloadManager 在那个位置下载吗? Android 文档说,即使scoped storage 触发意图并授予其他应用程序的权限,我们需要做的只是授予此​​权限:FLAG_GRANT_READ_URI_PERMISSION (我已经在这样做了)。那么这是否意味着所有路径都可以通过这种方式被意图接收应用程序访问?如果不是,那么如果MediaStore.Downloads 存储在下载目录和其他应用程序可以通过SAF 访问它,那么它是否应该不能通过意图触发访问?如果是,为什么我当前的实现会间歇性失败。

任何线索都将受到高度赞赏。谢谢。

【问题讨论】:

    标签: android-intent mediastore download-manager storage-access-framework scoped-storage


    【解决方案1】:

    然后我使用已弃用的 getExternalStoragePublicDirectory() 方法创建一个 FILE 对象,并为所有适当的应用程序触发一个意图来处理 PDF 查看。

    这不是要走的路。

    相反,您应该为 ACTION_DOWNLOAD_COMPLETE 注册一个广播接收器。

    在 onReceive() 中,您可以获得下载文件的 uri。

    将该 uri 与您的意图 ACTION_VIEW 的授予读取权限标志一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-27
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2012-08-28
      相关资源
      最近更新 更多