【发布时间】:2021-02-19 12:39:01
【问题描述】:
场景
我正在尝试创建许多文件,作为用户的一项功能。例如,我可能会编写一个应用程序,为他们过去几周听的每首歌曲创建一个文件(例如,带有歌词的文本文件)。我不能让用户为我生成的每个文件选择目录和文件名,这需要几个小时。用户应该可以从其他应用程序访问这些文档。
解决方案(不是真的)
在 Android 11 中,存储访问框架似乎不再有用。我注意到最初有 2 个有趣的选项:
- 创建一个新文件(创建启动活动,用户与之交互以仅保存一个文件),描述 here
- 授予对目录内容的访问权限(允许读取访问权限,但无法写入任何文档),描述为 here。
-
注意:如果您以 Android 10 为目标并请求
WRITE_EXTERNAL_STORAGE,则已经存在解决方案。不幸的是,此权限在 Android 11 上被拒绝。因此,我无法使用发布在 here 的解决方案。 - 使用存储访问框架(特别是
ACTION_OPEN_DOCUMENT_TREE)访问目录以访问目录,但我无法将文件写入此目录。 (我得到FileNotFoundException,因为这不是一条普通路径,而是一条树路径。)
判决
我想在我的情况下,我需要走“管理存储设备上的所有文件”的路线,如here 所述,其中涉及使用ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 启动一个额外的活动。我宁愿不请求读取整个驱动器的权限或让用户进入设置应用程序以授予权限。写入文件不需要任何权限...
您将如何为用户保存许多(非媒体)文件?
【问题讨论】:
-
使用数据库存储您的数据,然后允许用户在需要时将其内容“导出”到单独的文件?
-
用户真的需要这些文件吗?他是否与这些文件进行交互?创建这些文件的原因是什么?
-
@MarcinOrlowski:如果我想将数据库导出为具有不同信息的 10 个文件怎么办?用户必须使用 SAF 10 次?我认为这是不合理的。
-
@LenaBru:保存“许多”文件的用例很多,例如,NLP 应用程序可能希望为每张图片创建一个文本文件,描述其内容。音乐应用程序可能想要编写单独的歌词。它对于调试某些类型的应用程序也很有用,我们希望看到文件以良好的格式保存。在 Android 11 上,即使使用
adb shell或 Android Studio 文件资源管理器,您也无法查看应用特定目录(内部或外部)。用户可以将这些文件/文档用作文件、共享、组织在文件夹中、与其他应用程序一起打开。 不要忘记文件。 -
it seems like Storage Access Framework is not going to be useful.是的。您只需让用户选择一个目录一次,就可以在应用的整个生命周期内完成。
标签: android storage-access-framework