繁体   English   中英

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

[英]Android Google DriveApi returning different DriveID for same title on different devices

首先,我知道每个文件/文件夹的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 Found 1 existing folders ,然后Returning existing folder 此外,在你提到使用await()我正在关闭我自己的线程,这绝对不会在UI线程上调用,所以不用担心。

测试代码

我注意到sqlite db没有复制过,然后让我弄清楚即使文件夹都没有交叉,所以我写了另一个测试:

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),DRIVE_ID和RESOURCE_ID中的每个对象(文件夹或文件)都有2个ID。

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

如果使用GDAA创建文件/文件夹,则RESOURCE_ID可能无法立即使用,因为GDAA需要“提交”对象才能获取它。 SO 22432431

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

另外,要注意这样一个事实,即将GDAA添加到等式中(与使用普通的RESTful API相反),您添加的层具有您无法控制的自身延迟。 'ChangeEvent Listener'和'requestSync()'也没有帮助。 SO 23073474

为了给你一个提示,在花了几个月的时间来解决同样的问题后,我回滚到RESTful API,使用数据提供程序和同步适配器,轮询Drive进行更改。 下一步是添加基于GCM的同步。 我希望同步(使用GCM)将内置在GDAA中。 但它显然不是。 而你还没有尝试删除文件/文件夹,这才是真正有趣的开始

祝好运。

像这样设置appFolder帮助吗?

String appFolder = Drive.DriveApi.getAppFolder(mGoogleApiClient()).getDriveId().getResourceId().toString();

我遇到了同样的问题(重复的文件夹),我在运行搜索查询之前使用requestSync解决了:

Drive.DriveApi.requestSync(getGoogleApiClient()).await();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM