API de Google Drive para Android: comprueba si existe una carpeta

Estoy tratando de averiguar cómo comprobar si existe una carpeta en Google Drive con la nueva API de Google Drive para Android

He intentado lo siguiente, pensando que se bloquearía o devolvería null si la carpeta no se encuentra, pero no lo hace (siempre y cuando sea un DriveId válido, aunque se haya eliminado la carpeta).

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

¿Si intento crear un archivo la carpeta que consigo del código antedicho, no se cae tampoco? Estoy claramente teniendo un poco de tiempo difícil entender cómo funciona esta nueva API a todos juntos, especialmente con los tutoriales muy limitado y SO preguntas por ahí, y estoy realmente atrapado en este, por lo que cualquier entrada será muy apreciada.

Sólo para aclarar mi problema: Estoy creando un archivo en una carpeta especificada de Google Drive, pero si la carpeta no existe (ha sido eliminada por el usuario), quiero crearla primero.

Después de un montón de investigación este es el código que terminé con. Funciona correctamente, pero tiene un problema: cuando una carpeta se destruye en Google Drive, tarda un tiempo (horas) antes de que se actualicen los metadatos que puedo recuperar de mi aplicación, lo que significa que este código puede detectar primero si la carpeta se ha desechado Un par de horas más tarde el evento de basura ocurrió realmente – más información y discusiones se pueden encontrar aquí .

 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"); } } }; } 

Si está creando una carpeta basada en su estado de existencia, el método 'createTree ()' aquí solo hace eso.

Los siguientes 2 fragmentos de código listan archivos / carpetas basados ​​en argumentos pasados ​​(dentro de una carpeta, globalmente, basados ​​en el tipo MIME …). La línea con md.getTitle () es la que se puede utilizar para interrogar archivos / carpetas.

 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(); } } } 

Probablemente, la clave esté comprobando el estado "isTrashed ()". Dado que el archivo 'remove' en la web sólo lo mueve a TRASH. Además, la eliminación en general (en el sitio web, ya que no hay "BORRAR" en la API ) es un poco escamosa. Lo estaba probando por un tiempo, y puede tomar horas, antes de que el estado "isTrashed ()" se actualice. Y el vaciado manual de la papelera en Google Drive tampoco es fiable. Vea este número en Github .

Hay un poco más de conversación aquí , pero probablemente sin relación con su problema.

Puede intentar obtener los metadatos de la carpeta. Si la carpeta no existe, esto fallará.

  • No hay intención de UserRecoverableAuthIOException con Drive SDK para Android
  • Error de ConnectionRequire de la API de Google Drive para Android
  • Excepción de autenticación de Google Drive: ¿necesita permiso? (V2)
  • Guardar archivo en una carpeta específica con Google Drive SDK
  • Cómo seleccionar los archivos de la unidad de google en android?
  • ¿Es Google Drive RealTime API para Android?
  • Android: solicitud HTTP de Google Drive
  • Error al iniciar sesión en la cuenta especificada. Elija una cuenta diferente
  • Carpeta de datos de aplicaciones de Google Drive para Android que no incluye todos los niños
  • Cómo perder contenido de archivos en Google Drive
  • API de Google Drive \ Docs para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.