Android Google DriveApi 在不同设备上为同一标题返回不同的 DriveID

标签 android google-drive-api google-drive-android-api

所以首先我知道每个文件/文件夹的 DriveID 是特定于设备的,但 resourceId 是恒定的,这就是我用来测试项目是否相同的真正原因(当然除了标题)。

问题

我正在尝试跨设备同步我的 AppFolder 中的文件夹,但是,尽管在执行任何操作之前通过标题进行查询,但我在每台设备上都获得了不同的文件/文件夹。所以一些代码:

我如何设置 api 客户端

 mGoogleApiClient = new GoogleApiClient.Builder(context.getApplicationContext())
                .addApi(Drive.API)
                .addApi(Plus.API)//used for logout process
                .addScope(Drive.SCOPE_APPFOLDER)
                .addConnectionCallbacks(OnConnection)
                .addOnConnectionFailedListener(OnFailedListener)
                .build();

我如何设置 appFolder

appFolder = Drive.DriveApi.getAppFolder(mGoogleApiClient);

我已验证我在两台设备上获得了相同的 AppFolder resourceId。

我如何创建/获取文件夹

private static DriveFolder CheckForOrCreateDriveFolder(DriveFolder appFolder, String folder) {
    MetadataBuffer metadataBuffer = appFolder.queryChildren(mGoogleApiClient, new Query.Builder().addFilter(Filters.eq(SearchableField.TITLE, folderName)).build()).await().getMetadataBuffer();
    if(metadataBuffer != null&&metadataBuffer.getCount()>0) {
        Log.v(TAG,"Found "+metadataBuffer.getCount()+" existing folders");
        Metadata metadata = metadataBuffer.get(0);
        if (metadata != null && metadata.isFolder()) {
            Log.v(TAG,"Returning existing folder");
            return Drive.DriveApi.getFolder(mGoogleApiClient, metadata.getDriveId());
        }else{
            Log.v(TAG,"Returning created folder even though we found meta data");
            return appFolder.createFolder(mGoogleApiClient, new MetadataChangeSet.Builder().setTitle(folderName).build()).await().getDriveFolder();
        }
    }else{
        Log.v(TAG,"Returning created folder");
        return appFolder.createFolder(mGoogleApiClient, new MetadataChangeSet.Builder().setTitle(folderName).build()).await().getDriveFolder();
    }
}

在这一点上,我总能得到预期的结果。 IE。 找到 1 个现有文件夹,然后 返回现有文件夹。另外,在你提到 await() 的使用之前,我正在分离我自己的线程,并且它永远不会在 UI 线程上调用,所以不用担心。

测试代码

我注意到 sqlite 数据库没有复制,然后让我弄清楚甚至文件夹都没有交叉,所以我写了另一个测试:

DriveApi.MetadataBufferResult metadataBufferResult = appFolder.listChildren(mGoogleApiClient).await();
Log.v(TAG,"AppFolder Contents:");
for (Metadata metadata : metadataBufferResult.getMetadataBuffer()) {
    Log.v(TAG,"MD:"+metadata.getTitle()+" : "+metadata.getDriveId().getResourceId()+" - "+(metadata.isFolder()?"is a folder":"is a file"));
}

对于一台设备返回:

AppFolder Contents:
MD:itemImage : 1eFvDS6cWmCbgblahblahblahblahblah - is a folder
MD:itemAudio : 1c86N8AGRV8Bblahblahblahblahblah - is a folder
MD:userImage : 1LnsgFneT-l3ZYzMbblahblahblahblah - is a folder
MD:db.sqlite : 1DH4QfUfrsxDScblahblahblahblah - is a file

另一个:

AppFolder Contents:
MD:itemAudio : 1CqeVASm_Gjjblahblahblahblahblah - is a folder
MD:itemImage : 1Djs059FYGSfOblahblahblahblahblah - is a folder
MD:userImage : 1U5c5yCw-XdfCblahblahblahblahblah - is a folder
MD:db.sqlite : 15qR3WLmvT3Nn2Ztblahblahblahblahblah - is a file

我已验证 4 次或更多次这些设备使用的是同一个 Google 帐户。如果有任何其他代码或信息我可以为您提供帮助,请告诉我!任何帮助找到这个问题的答案将不胜感激^^谢谢!

最佳答案

不幸的是,我在你的具体案例解释中迷路了,但如果我只看标题,我可以给你一些线索,因为我遇到了同样的问题。

GDAA (Google Drive Android Api) 中的每个对象(文件夹或文件)都有 2 个 ID,即 DRIVE_ID 和 RESOURCE_ID。

DRIVE_ID 标识符特定于您的特定设备,因此如果您在其他设备上使用它,则没有任何意义。 RESOURCE_ID 在设备之间是唯一的,因此您需要使用它来进行任何类型的同步。参见 SO 22841237 .

如果您使用 GDAA 创建文件/文件夹,RESOURCE_ID 可能不会立即可用,因为 GDAA 需要“提交”对象才能获取它。参见 SO 22432431 .

根本不要使用文件/文件夹标题(名称),因为它不是 Google Drive 世界中的主要 ID。您可以在同一区域中拥有多个具有相同标题(名称)的云端硬盘对象。

另外,请注意,将 GDAA 添加到等式中(与使用普通 RESTful API 相反),您将添加一个具有您无法控制的延迟的层。 “ChangeEvent Listener”和“requestSync()”也无济于事。参见 SO 23073474 .

只是给你一个提示,在花了几个月的时间解决同样的问题之后,我回滚到 RESTful API,使用数据提供程序和同步适配器,轮询驱动器以进行更改。下一步将是添加基于 GCM 的同步。我希望同步(使用 GCM)将内置在 GDAA 中。但显然不是。而且您还没有尝试删除文件/文件夹,这就是 real fun begins 的地方.

祝你好运。

关于Android Google DriveApi 在不同设备上为同一标题返回不同的 DriveID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26668447/

相关文章:

android - Fabric.io 中的 API key 和构建 secret 有什么区别?

Java Google Drive API 没有客户端 secret 或新项目

java - 使用 Java 仅更新现有 Google Drive 文件的元数据

android - 驱动应用程序数据和速率限制

android - unity添加sdk报 `no resources found`错误

android nfc 设置切换监听器

android - 无法在android中的xmpp服务器中连接

google-apps - 使用 PHP 代码示例时,“webViewLink”为空/空

java - 异常 java.lang.NoClassDefFoundError : com. google.android.gms.common.AccountPicker

android - 无法在谷歌驱动器的公用文件夹中创建文件