SyncAdapter sin una cuenta

Estoy intentando crear un SyncAdapter para mi aplicación de Android para mostrar videos de YouTube de un canal específico. Los videos son de dominio público, así que no quiero que el usuario inicie sesión, cree una cuenta, se autentique, cargue datos o utilice la base de datos de contactos. Simplemente quiero que SyncAdapter actualice periódicamente la base de datos de mi aplicación con los metadatos de vídeo más recientes de ese canal. Ya he construido un ContentProvider para acceder a mi base de datos. Me gusta el hecho de que el SyncProvider se encargará de la capacidad de desactivar la sincronización, la programación y reintentar los mecanismos de retroceso para la actualización.

Pregunté antes si un SyncAdapter era una buena opción para mi caso de uso, y me dijeron que era. Vi el video de I / O de Google, leí los documentos, leí blogs … (ver lista abajo). No he podido conseguir nada para trabajar. Lo mejor que he conseguido es que la cuenta de SyncAdapter aparezca en la configuración global de "Cuentas y sincronización", pero no sea funcional. Incluso si esto funcionó, sería menos que ideal porque prefiero que el usuario no vea la cuenta, excepto desde dentro de mi aplicación. Esto sería aceptable si no había otra opción, siempre y cuando no es necesario acceder a él para configurarlo como todo lo que por defecto a la sincronización automático una vez al día.

Incluso intenté usar el SampleSyncAdapter como está y poner puntos de interrupción en las secciones de código de autenticación. No se produce un solo punto de interrupción, por lo que no puedo ver qué desencadena las llamadas o qué datos están contenidos. Me habría pensado que al menos conseguir que mucho.

Estoy empezando a pensar que usar un SyncAdapter es una mala idea a pesar de la recomendación. Todavía tengo que encontrar un ejemplo que está cerca de lo que quiero, y mucho menos un tutorial o completo, organizado y documentos claros. Esto parece que debería ser una tarea común que muchas aplicaciones querrían hacer.

Añada a esta publicación cualquier buena documentación sobre este caso de uso. No puedo encontrar ninguno.
Sin esto, creo que es justo recomendar a todos que no utilicen SyncAdapters para este caso de uso. No estoy hablando para otros casos de uso aquí, así que no saltar con cómo funcionó para su caso de uso si no es como el mío.

También sería útil saber qué versión del nivel de la API se considera lista para el horario estelar. Hay una serie de problemas publicados con respecto a los números de versión. Estoy tratando de permanecer lo más bajo posible para obtener la mayoría de los usuarios. Mi objetivo API actual es 7.

Aquí está la lista de enlaces que he intentado sin éxito, otros pueden encontrar estos más útiles:

Http://developer.android.com/resources/samples/SampleSyncAdapter/index.html

Http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

Http://naked-code.blogspot.com/2011/05/revenge-of-syncadapter-synchronizing.html

Writing an Android Sync Provider: Part 1

Writing an Android Sync Provider: Part 2

Http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step

Http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step-1

Http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step-2

Android SyncAdapter sin autenticación vs. Android Service

¿Por qué ContentResolver.requestSync no activa una sincronización?

En resumen, la respuesta es: ContentProvider , AccountManager y SyncAdapter van juntos. Usted debe tener estas tres piezas, incluso si son "tonto".

Como se indicó anteriormente, "ContentProvider, AccountManager y SyncAdapter van juntos". Para su aplicación, puede llamar a la siguiente actividad la primera vez que se carga la aplicación para autenticarse e iniciar la sincronización automáticamente:

 public class LoginActivity extends AccountAuthenticatorActivity { private final static String DUMMY_ACCOUNT_NAME = "some_name"; private final static String DUMMY_ACCOUNT_PASS = "some_pass"; private final static String AUTHORITY = "com.android.contacts"; // for example /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Account account = new Account(DUMMY_ACCOUNT_NAME, Constants.ACCOUNT_TYPE); AccountManager am = AccountManager.get(this); if (am.addAccountExplicitly(account, DUMMY_ACCOUNT_PASS, null)) { Bundle result = new Bundle(); result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); setAccountAuthenticatorResult(result); ContentResolver.setSyncAutomatically(account, AUTHORITY, true); } finish(); } } 

Esto funciona en la API de Android 5+.

  • Eliminar la base de datos cuando se quita una cuenta
  • Evitar el bucle de sincronización de red al sincronizar desde la red en Android ContentProvider
  • SyncAdapter no recibe llamadas en "Network tickle"
  • La primera vez sincroniza bucles indefinidamente
  • Adaptador de sincronización de Android con cuentas de usuario de Google Appengine
  • Sincronización de varios proveedores con un SyncAdapter
  • ¿Se notifica SyncAdapter cuando AccountManager elimina la cuenta?
  • Desiging una aplicación de Android con Sincronización sin conexión. ¿Debo usar SyncAdapter?
  • Sincronización personalizada que no funciona con la cuenta de Google (com.google) en algunos dispositivos Samsung
  • Ocultar la cuenta ficticia para el adaptador de sincronización de la configuración
  • Opciones de SyncAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.