[英]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.