我一直在尝试从Google云端硬盘中检索文件列表,但Drive.DriveApi.query的响应非常不一致。
我有一个像这样的文件目录结构:
+ myRootFolder
|
+--+ folderA
+-- cover.jpg
|
+ folderB
+-- cover.jpg
+
...
我希望得到所有文件夹的“cover.jpg”文件:
private void fetchFolders(final GoogleApiClient gClient) {
// 1: get a reference to myRootFolder
//
Query query1 = new Query.Builder()
.addFilter(Filters.eq(SearchableField.TITLE, "myRootFolder"))
.build();
Drive.DriveApi.query(gClient, query1).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult result1) {
MetadataBuffer mb1 = result.getMetadataBuffer();
DriveId rootDriveId = mb1.get(0).getDriveId();
mb1.close();
DriveFolder rootFolder = Drive.DriveApi.getFolder(gClient, rootDriveId);
// 2: get a reference to all folders
//
rootFolder.listChildren(gClient).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult result2) {
List <DriveId> folders = new ArrayList<DriveId>();
MetadataBuffer mb2 = result2.getMetadataBuffer();
for (Metadata md : mb2) {
folders.add(md.getDriceId())
}
mb2.close();
// 3: get cover.jpg of all folders
//
for (DriveId folderId: folders) {
Query query2 = new Query.Builder()
.addFilter(Filters.eq(SearchableField.TITLE, "cover.jpg"))
.addFilter(Filters.in(SearchableField.PARENTS, folderId))
.build();
Drive.DriveApi.query(gClient, query2).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult result3) {
MetadataBuffer mb3 = result3.getMetadataBuffer();
assert mb3.getCount() == 1; // <<<<<<<<< FAIL HERE
}
});
}
}
});
}
});
}
断言应该通过,因为所有文件夹都有一个cover.jpg文件,但实际结果是,某些文件夹通过测试而其他文件夹失败...这令人困惑。此外,结果因设备而异(某些设备在folderA中失败,但其他设备在folderB中失败)。
我错过了什么?
编辑2014-07-18:
想要提及可以使用iOS SDK和Javascript(Node.js)API检索这些文件而不会出现任何问题。只是不使用Android SDK。
答案 0 :(得分:0)
试
Drive.DriveApi.requestSync(GoogleApiClient client)
可能有所帮助。
答案 1 :(得分:0)
Android SDK仅返回授权应用程序的文件(即由相同应用程序ID创建的文件,或之前由应用程序ID打开的文件)。
您可以使用云端硬盘用户界面来验证您的应用授权的文件。转到https://drive.google.com&gt;齿轮菜单&gt;管理应用&gt; yourapp选项&gt;查看此应用有权访问的所有文件。
如果是&#34; cover.jpg&#34;文件没有被授权用于有错误的文件夹,请尝试选择&#34; cover.jpg&#34;使用相同的应用ID。
答案 2 :(得分:0)
您可以尝试使用旧版Google云端硬盘(Gear menu > Leave the new Drive
)使用p00ya提供的路径查看您的应用有权访问的文件。
似乎新版本的Google云端硬盘尚未实现此功能。
答案 3 :(得分:0)
我不确定你是否遗漏了什么。我在这里得到了这个: https://developers.google.com/drive/android/queries
构建Query对象后,可以使用Drive.DriveApi在整个文件系统上执行,如下所示:
Drive.DriveApi.query(googleApiClient, query);
此查询从My Drive(根)文件夹开始,以递归方式遍历整个文件系统,返回与Filters表达式树匹配的所有条目。
您真的需要找到特定的文件夹名称并遍历吗?或者直接查询'cover.jpg'的工作?