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).
- API de Android para Google Drive?
- API de Google Drive para Android: sólo Drive.SCOPE_FILE acceso, solo necesita lectura
- ¿Está en peligro la eliminación gradual de la función de enlace de host de Google Drive?
- Carga reanudable en Drive Rest API V3
- Excepción de SDK de Google Drive
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.
- La intención de Android de compartir datos de texto / datos sencillos en Google Drive
- El detector de progreso de subida no se disparó (API de unidad de Google)
- Google Drive GET_CONTENT archivo de lectura de intenciones
- Abrir y guardar archivos de Android en / desde el SDK de Google Drive
- ID de cliente del SDK de Google Drive
- ¿Cómo configurar proguard para la aplicación de Android con Google Drive SDK?
- Autorizar mi aplicación para usar una carpeta existente
- Seleccionar la imagen de sdcard y almacenarla en Google Drive
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á.
- Qt5 QGeoPositionInfoSource :: createDefaultSource () se bloquea en Android 5.0
- Abrir navegador con la última URL visitada