API Android для Google Диска - проверьте, существует ли папка
Я пытаюсь выяснить, как проверить, существует ли папка на Google Диске, используя новый Google Android API для Android.
Я пробовал следующее, считая, что он либо сбой, либо возврат null, если папка не найдена, но она этого не делает (до тех пор, пока она действительна DriveId, хотя папка была удалена).
DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), driveId));
Если я попытаюсь создать файл, который я получаю из вышеуказанного кода, он тоже не сбой?
Мне явно трудно понять, как этот новый API работает вместе, особенно с очень ограниченными учебниками и SO-вопросами, и я действительно зацикливаюсь на этом, поэтому любой ввод будет оценен по достоинству.
Просто для выяснения моей проблемы: я создаю файл в указанной папке Google Диска, но если папка не существует (была удалена пользователем), я хочу ее создать в первую очередь.
Ответы
Ответ 1
После многих исследований это код, в котором я оказался. Он работает правильно, но имеет проблему. Когда папка повреждена на Google Диске, требуется некоторое время (часы) до того, как метаданные, которые я могу извлечь из моего приложения, обновлены, что означает, что этот код может сначала определить, была ли папка повреждена через пару часов произошло событие trashing - дальнейшие сведения и обсуждения можно найти здесь.
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");
}
}
};
}
Ответ 2
Если вы создаете папку, основанную на ее статусе существования, метод 'createTree() здесь делает именно это.
Следующие два фрагмента кода перечисляют файлы/папки на основе переданных аргументов (внутри папки, в глобальном масштабе, на основе типа 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 не существует "УДАЛИТЬ" ), является немного шелушащимся. Я тестировал его некоторое время, и это может занять несколько часов, прежде чем статус "isTrashed()" будет обновлен. И ручная очистка мусора в Google Диске также ненадежна. См. Эту проблему в Github.
Здесь немного больше разговоров, но, вероятно, не связано с вашей проблемой.
Ответ 3
Вы можете попытаться получить метаданные для этой папки. Если папка не существует, это не будет выполнено.