小编And*_*rsC的帖子

适用于Google云端硬盘的Android API?

目前发布的API似乎专注于Chrome商店应用.

是否会有适用于Android的API,是否可以使用Google文档列表数据等现有API?如果是这样,哪个URL应该用于列出/访问文件?

android google-drive-api

18
推荐指数
1
解决办法
1万
查看次数

在Lollipop上使用Android Storage Access框架列出文件时出错

背景

我有一些应用程序大量使用SD卡进行文件同步.Kitkat上破坏的外部SD卡访问仍然是一个大问题,但我正在尝试使用Lollipop上提供的新API为具有此功能的用户解决此问题.

我成功请求并持有SD卡的权限,我可以列出从授予权限活动返回的根Uri中的文件.

查看有关如何在此处完成此操作的更多信息: 如何使用新的-sd-card-access-api-present-for-lollipop

然后,用户可以选择任何文件夹/子文件夹进行同步,并将文件夹文档Uri作为数据库中的字符串保留.

问题

稍后,可能在重新启动应用程序后,可以启动文件的同步.然后我尝试列出子文件夹中的文件(记住,我已经授予了正确的权限,并且这种工作的持久性也允许我访问所有子文件).

然后,我从存储的字符串创建一个新的DocumentFile实例,并尝试列出文件:

  DocumentFile dir = DocumentFile.fromTreeUri(ctx, Uri.parse(storedUri));
  dir.listFiles();
Run Code Online (Sandbox Code Playgroud)

问题是listFiles总是返回授予根Uri的子节点,而不是实际Uri的子节点我给DocumentFile.fromTreeUri方法.

我已经检查了DocumentFile的源代码,似乎有一个bug,特别是我没有看到需要进一步修改Uri:

public static DocumentFile fromTreeUri(Context context, Uri treeUri) {
  final int version = Build.VERSION.SDK_INT;
  if (version >= 21) {
    return new TreeDocumentFile(null, context,
      DocumentsContractApi21.prepareTreeUri(treeUri));
  } else {
  return null;
}
Run Code Online (Sandbox Code Playgroud)

如果我们查看DocumentsContractApi21.prepareTreeUri的来源,我们会看到重建Uri:

 public static Uri prepareTreeUri(Uri treeUri) {
   return DocumentsContract.buildDocumentUriUsingTree(treeUri,
     DocumentsContract.getTreeDocumentId(treeUri));
 }
Run Code Online (Sandbox Code Playgroud)

它调用的方法:

 public static Uri buildDocumentUriUsingTree(Uri treeUri, String documentId) {
   return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(treeUri.getAuthority()).appendPath(PATH_TREE)
                 .appendPath(getTreeDocumentId(treeUri)).appendPath(PATH_DOCUMENT)
                 .appendPath(documentId).build();
 }

 public static String getTreeDocumentId(Uri documentUri) …
Run Code Online (Sandbox Code Playgroud)

android android-sdcard android-5.0-lollipop documentfile

9
推荐指数
1
解决办法
1852
查看次数