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).
- Inicio rápido de la unidad NullPointerException
- GooglePlayServices no está disponible debido al error 2
- ¿Cómo crear carpetas en Google Drive sin duplicar?
- Enumeración de carpetas y archivos con Google Drive SDK V2
- Cómo importar Google API en Android Studio
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.
- No se puede crear un archivo dentro de una carpeta pública en Google Drive
- Google Drive OCR Android
- Cómo subir una copia de seguridad del teléfono Llamar / sms / contactos a Google Cloud
- Cómo evitar cargar siempre los datos de la aplicación almacenados en caché desde Google Drive
- Unidad de Google para realizar copias de seguridad y restaurar la base de datos y las preferencias compartidas de la aplicación de Android
- Android Google Drive SDK - cómo mostrar la lista de archivos en la carpeta seleccionada
- Android: accede a la carpeta de aplicaciones de Google Drive desde otro dispositivo, pero la misma aplicación
- Carga reanudable en Drive Rest API V3
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