目前发布的API似乎专注于Chrome商店应用.
是否会有适用于Android的API,是否可以使用Google文档列表数据等现有API?如果是这样,哪个URL应该用于列出/访问文件?
背景
我有一些应用程序大量使用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)