API Android для Google Диска – проверьте, существует ли папка

Я пытаюсь выяснить, как проверить, существует ли папка на Google Диске с помощью нового API Android для Google Диска

Я пробовал следующее, считая, что он либо сбой, либо возврат null, если папка не найдена, но она этого не делает (до тех пор, пока она является допустимым DriveId , даже если папка была удалена).

DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), driveId)); 

Если я попытаюсь создать файл, который я получаю из вышеуказанного кода, он тоже не сбой? Мне явно трудно понять, как этот новый API работает вместе, особенно с очень ограниченными учебниками и SO-вопросами, и я действительно зацикливаюсь на этом, так что любой вход будет очень оценен.

Просто для выяснения моей проблемы: я создаю файл в указанной папке Google Диска, но если папка не существует (была удалена пользователем), я хочу ее создать в первую очередь.

После многих исследований это код, в котором я оказался. Он работает правильно, но имеет проблему: при падении папки в Google Диске требуется некоторое время (часы) до того, как метаданные, которые я могу извлечь из моего приложения, будут обновлены, что означает, что этот код может сначала определить, была ли папка повреждена Через пару часов произошло событие разгрома – дополнительную информацию и обсуждения можно найти здесь .

 public class checkFolderActivity extends BaseDemoActivity { @Override public void onConnected(Bundle connectionHint) { super.onConnected(connectionHint); DriveId folderId = DriveId.decodeFromString(folderId); DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, folderId); folder.getMetadata(mGoogleApiClient).setResultCallback(metadataRetrievedCallback); } final private ResultCallback<DriveResource.MetadataResult> metadataRetrievedCallback = new ResultCallback<DriveResource.MetadataResult>() { @Override public void onResult(DriveResource.MetadataResult result) { if (!result.getStatus().isSuccess()) { Log.v(TAG, "Problem while trying to fetch metadata."); return; } Metadata metadata = result.getMetadata(); if(metadata.isTrashed()){ Log.v(TAG, "Folder is trashed"); }else{ Log.v(TAG, "Folder is not trashed"); } } }; } 

Если вы создаете папку на основе ее статуса существования, метод createTree () здесь делает именно это.

Следующие 2 фрагмента кода перечисляют файлы / папки на основе переданных аргументов (внутри папки, в глобальном масштабе, на основе типа MIME …). Строка с md.getTitle () – это та, которую вы можете использовать для опроса файлов / папок.

 GoogleApiClient _gac; void findAll(String title, String mime, DriveFolder fldr) { ArrayList<Filter> fltrs = new ArrayList<Filter>(); fltrs.add(Filters.eq(SearchableField.TRASHED, false)); if (title != null) fltrs.add(Filters.eq(SearchableField.TITLE, title)); if (mime != null) fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime)); Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build(); MetadataBufferResult rslt = (fldr == null) ? Drive.DriveApi.query(_gac, qry).await() : fldr.queryChildren(_gac, qry).await(); if (rslt.getStatus().isSuccess()) { MetadataBuffer mdb = null; try { mdb = rslt.getMetadataBuffer(); if (mdb == null) return null; for (Metadata md : mdb) { if ((md == null) || md.isTrashed()) continue; --->>>> md.getTitle() } } finally { if (mdb != null) mdb.close(); } } } void listAll(DriveFolder fldr) { MetadataBufferResult rslt = fldr.listChildren(_gac).await(); if (rslt.getStatus().isSuccess()) { MetadataBuffer mdb = null; try { mdb = rslt.getMetadataBuffer(); if (mdb == null) return null; for (Metadata md : mdb) { if ((md == null) || md.isTrashed()) continue; --->>>> md.getTitle() } } finally { if (mdb != null) mdb.close(); } } } 

Ключ, вероятно, проверяет статус isTrashed (). Так как файл 'remove' в сети только перемещает его в TRASH. Кроме того, удаление в целом (на веб-сайте, так как в API нет «DELETE» ), это немного шелушатся. Я тестировал его некоторое время, и это может занять несколько часов, прежде чем статус «isTrashed ()» будет обновлен. И ручная очистка мусора в Google Диске также ненадежна. См. Эту проблему в Github .

Здесь немного больше разговоров , но, вероятно, не связано с вашей проблемой.

Вы можете попробовать получить метаданные для этой папки. Если папка не существует, это не удастся.