我读到我必须为Android Q版本预先准备好我的应用程序,因为如果不撤消对应用程序拥有的目录之外文件的通用读取/写入访问权限,那么它们将被弃用。
幸运的是,我没有多少行代码可以更改。
事实是,存储访问框架似乎存在一些问题。我在基特卡特(Kitkat)那里(我不知道)。否则我的代码是错误的。
我不能简单地使用户在云存储上选择一个文件夹,以获取Uri作为回报,以进一步填充该文件夹。
当我使用
处的示例代码时并将其放入基本活动应用程序(由IDE创建的示例默认应用程序)中,可能会发生用户无法选择云存储根目录而只能选择磁盘位置的情况。它在Kotlin中,但我将其翻译成Java而没有更改。这不是Java问题,因为我也尝试过Kotlin版本。
[我用其他技巧编写了其他代码,这些技巧至少导致将云文件夹Uri放回onActivityResult方法中。它包含使用不同的Intent Action,但仍然不能满足我的目的,中间件不喜欢它,因此会破坏Storage Access Framework - failing to obtain document tree from uri (returned from Drive app)]
在两种情况下,我都有相同的路径:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="filesPath" path="/"/>
<external-path name="externalPath" path="/"/>
<external-files-path name="externalFilesPath" path="/"/>
</paths>
如何让用户在云提供商上选择文件夹以及如何获取uri?
答案 0 :(得分:1)
DocumentsProvider
可以分别使用标志FLAG_SUPPORTS_IS_CHILD
和FLAG_SUPPORTS_CREATE
选择是否支持ACTION_OPEN_DOCUMENT_TREE
和ACTION_CREATE_DOCUMENT
。
Google云端硬盘目前不支持ACTION_OPEN_DOCUMENT_TREE
,因此这就是无法选择它的原因。
我相信Nextcloud支持ACTION_OPEN_DOCUMENT_TREE
,因此可能会有所帮助。
我用一些技巧编写了其他代码,这些技巧至少导致将云文件夹Uri放回onActivityResult方法中。它包含使用不同的Intent Action,但仍然不能满足我的目的,中间件不喜欢它,因此它破坏了Storage Access Framework-无法从uri获取文档树(从Drive应用返回)
是的。然后将返回的URI传递给提供程序(在本例中为Google Drive),由提供程序最终决定要返回的文档。由于云端硬盘不支持这种子关系,因此无法正常工作。
Ian Lake的博客文章Building a DocumentsProvider中对此有更多详细说明。