Drive.DriveApi.query返回不一致的结果

时间:2014-07-14 15:04:36

标签: android google-drive-api

我一直在尝试从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。

4 个答案:

答案 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'的工作?