Android Google Play / Drive Api

Hola, estoy utilizando Google Drive Api para almacenar una base de datos utilizando la función AppDataFolder. Tengo una aplicación de prueba que se ejecuta correctamente en un dispositivo. Soy capaz de cargar / actualizar / borrar / descargar el archivo de base de datos y reintegrarlo en el programa sin problemas.

El problema que tengo es cuando quiero compartir esta base de datos con otro dispositivo que ejecuta la misma aplicación, entonces las cosas no funcionan como se esperaba. Ejemplo de dispositivo AI cargar la base de datos, dispositivo B – Quiero descargar la base de datos, pero no se encuentra ningún archivo (este retraso puede variar mucho de segundos a horas). Razón de esto – cuando se utiliza el Api decide cuando quiere 'sincronizar' los datos, ya que está en cola en lugar de ser instantáneamente cargado. Así que cuando se utiliza en un dispositivo esto no es un problema, ya que toma el archivo 'sincronizado' del almacenamiento en la nube, o el archivo que espera para ser sincronizado.

He intentado varias cosas como intentar enumerar todos los archivos de AppDataFolder o recuperar metadatos a través de una consulta con filtros de búsqueda antes de hacer una solicitud para actualizar / eliminar etc. Sin embargo, no puedo conseguir que funcione como se desee fundamentalmente elige cuando sincronizar.

Así que mi pregunta real es: ¿Cómo puedo obligar a Google Drive a sincronizar mi archivo cuando lo quiero, es decir, cada vez que se realiza una solicitud, para que la sincronización se logra a través de múltiples dispositivos que utilizan la misma aplicación. Debe haber una respuesta como yo creo que esto es una razón fundamental por la que se utiliza el AppDataFolder es el primer lugar.

Gracias por adelantado

EDIT / UPDATE:

He podido encontrar una opción en el Api para 'sincronizar' el contenido de la unidad utilizando este código:

// try to sync Drive.DriveApi.requestSync(mGoogleApiClient).setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() { @Override public void onResult(com.google.android.gms.common.api.Status status) { if (!status.getStatus().isSuccess()) { Log.e("SYNCING", "ERROR" + status.getStatusMessage()); } else { Log.e("SYNCING", "SUCCESS"); // execute async task to list AppFolderContents new AppFolderContentsAsyncTask(getActivity()).execute(); } } }); 

Esto funciona bien para intentos de 3/4 en rápida sucesión, sin embargo llego a un límite de sincronización y mensaje de estado:

Se ha superado el límite de la tasa de solicitud de ERRORSync.

¿Hay alguna manera de aumentar la tasa de solicitud, ya que esto no es realmente deseable si tengo que tener una aplicación que pide al usuario, por favor, inténtelo de nuevo más tarde para sincronizar – no está seguro de cuánto tiempo tendrá que esperar hasta que puede aunque!

SOLUCIÓN – DE SORTS, Y MIS PENSAMIENTOS (por lo que vale)

La solución que estoy buscando (después de enviar un correo electrónico a un usuario de la aplicación que publicó una aplicación de unidad que se sincroniza sin problemas) es usar el Drive Rest Api, en lugar de la API de unidad más nueva (y preferida por Google). Traté de limitar el 'requestSync' a sólo cuando el usuario navegó a un fragmento con las opciones de unidad (en lugar de cada transacción de archivo). Sin embargo, esto probablemente resolver el límite de la tasa de requestSync en su mayor parte, pero todavía podría llegar a ese límite. Además, si varios dispositivos están ejecutando la aplicación y están vinculados a la misma cuenta de Drive estaban sincronizando / cargando / eliminando archivos al mismo tiempo en la aplicación, entonces existe la posibilidad de perder la sincronización – tal vez un escenario raro, pero aún es posible. No creo que hacer que un usuario deje de sincronizar archivos sea una opción viable en términos de experiencia de usuario o diseño de aplicaciones.

Aunque curioso, la aplicación Drive actual te permite actualizar (requestSync?) Tantas veces como quieras. Creé 20 carpetas en la interfaz web en rápida sucesión, después de cada carpeta se creó actualizé la aplicación Drive en mi teléfono y se sincronizó todas las 20 veces. Parece que Google entiende la importancia de la sincronización, pero opta por hacer esto muy difícil asegurar esto en su nueva unidad de API. Como ya se ha dicho la carga de archivos en el almacenamiento en la nube suele suceder de forma instantánea (está en cola, sin embargo, si tiene conectividad que sucede casi de inmediato). Yo habría pensado que esta es la costosa transacción en términos de mover datos / actualizar el contenido de la unidad, en lugar de sólo consultar para la sincronización de archivos. Sin embargo, usted puede seguir agregando archivos a la aplicación de su unidad una a la vez, y los sube uno a la vez casi al instante – donde como pide la sincronización más de 4 veces en 30 segundos y luego falla y usted tiene que "refrescarse ' por un momento.

Soy muy nuevo en la programación / Android en general – tan pronto como aprendo algo nuevo, me doy cuenta de lo poco que realmente sé, así que si su es una mejor solución por ahí usando la API de Drive (en lugar de REST API) Muy bienvenida.

DriveApi # requestSync le permitirá solicitar una "sincronización hacia abajo" desde el servidor al dispositivo. De esta manera, en el segundo dispositivo deberías poder ver el contenido cargado desde el primer dispositivo. Sin embargo, las llamadas a la sincronización de solicitudes son limitadas de tarifa (por dispositivo) para evitar abusos y garantizar una cantidad razonable de uso de datos por parte de la API de Drive. Lo ideal sería llamar a la sincronización de solicitud sólo cuando sea necesario. No hay manera de aumentar el límite de velocidad.

En cuanto a la finalización de la subida, después de confirmar una subida, no debe utilizar la sincronización de solicitud, ya que no le ayudará (sólo se sincroniza, pero no hacia arriba). La carga real se realizará lo antes posible (en función de la conectividad del dispositivo y de las preferencias especificadas por su aplicación a través de DrivePreferencesApi , que por defecto no tienen restricciones).

Si desea saber cuándo ocurrió la subida real, puede utilizar CompletionEvents . De esta manera, puedes probar tu aplicación con más información sobre lo que realmente está pasando.

  • Android google unidad de inicio rápido muestra la imagen de carga falla
  • Java.lang.NoClassDefFoundError: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
  • Java.lang.NoClassDefFoundError: com.google.android.gms.common.AccountPicker
  • No se pudo obtener la muestra de Token DrEdit android
  • Cómo perder contenido de archivos en Google Drive
  • Get filepath desde la unidad de google en Lollipop (MediaStore.MediaColumns.DATA == null)
  • Cómo reducir el código - 65k método límite en dex
  • ¿Cómo subir un archivo db a Google Drive desde la aplicación Android?
  • Cómo obtener el ID de archivo para poder realizar una descarga de un archivo de la API de Google Drive en Android
  • Abrir y guardar archivos de Android en / desde el SDK de Google Drive
  • Google Drive + ACTION_GET_CONTENT
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.