背景
迁移到 Android Q 后,我无法找到适当的方法来获得对文档文件夹 (/storage/emulated/0/Documents
) 的写访问权限。
在有关范围存储的许多其他问题被提及之前,我已经阅读了很多这方面的问题,并且从目前为止我所看到的所有解决方案都只使用应用程序专用目录或仅访问媒体目录(而不是文档文件夹)。
据我所知,在 Android Q 中,我可以选择:
- 使用仅可由我的应用程序(或我授权的应用程序)访问的应用程序专用目录
- 允许用户选择他们想要存储文件的位置(我认为这可以是公共位置)
ACTION_OPEN_DOCUMENT_TREE
问题
我开发的应用程序用于对受试者进行测试,测试数据会自动存储在公共可访问的文档文件夹中,类似于:/storage/emulated/0/Documents/myAppName/subjectName/testData-todaysDate.pdf
当用户希望访问测试数据时,他们将智能手机连接到计算机并导航到文档文件夹,其余部分很明显。出于这个原因,我必须使用公共可访问存储。此外,想象一下他们希望通过另一个应用程序在手机上打开测试数据,也是同样的情况!
我正在寻找的解决方案
因此,我正在寻找的解决方案需要能够执行以下操作:
- 不会多次要求权限(一次就可以)
- 自动保存测试数据,无需用户提示(因为会进行数百次测试)
- 保存到公共文档文件夹中,例如
/storage/emulated/0/Documents/
- 不需要用户选择目录,因此不使用
ACTION_OPEN_DOCUMENT_TREE
- 最好是数据持久化,这样卸载应用程序不会导致数据丢失
我知道 Android Q 中的这些变化旨在让用户更了解应用程序如何访问他们的数据,但一旦他们理解了您的应用程序如何使用数据,就不应该存在问题。
MediaStore.Downloads
(详情请见https://commonsware.com/blog/2020/01/11/scoped-storage-stories-diabolical-details-downloads.html)。"但是一旦他们了解了您的应用程序如何使用您的数据,就不应该有问题"——按照这种论点,您对`ACTION_OPEN_DOCUMENT_TREE`不应该有问题。用户只需要处理一次,之后您可以将尽可能多的文档写入该树中。 - CommonsWareACTION_OPEN_DOCUMENT_TREE
,他们可以在设置应用程序时选择公共位置,然后我们可以永久重复使用该位置。这可能是最好的解决方案,但仍然存在风险,因为用户可能会选择错误的位置,但总比没有好。 - JamesonACTION_OPEN_DOCUMENT_TREE
,他们可以在设置应用程序时选择公共位置,然后我们可以永久重复使用它吗?"-- 是的。" - CommonsWare