Итак, во-первых, я знаю, что 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 на обоих устройствах.
Как я создаю/получаю папки
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();
}
}
На этом я всегда получаю ожидаемый результат. т.е. Found 1 existing folders
, а затем Returning existing folder
. Кроме того, прежде чем вы упомянете об использовании await()
, я выделяю свои собственные потоки, и это НИКОГДА не вызывается в потоке пользовательского интерфейса, так что не беспокойтесь.
Тестовый код
Я заметил, что 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. Если есть какой-либо другой код или информация, которую я мог бы дать вам, пожалуйста, дайте мне знать! Любая помощь в поиске ответа на этот вопрос будет принята с благодарностью ^^ Спасибо!