2011-12-18 12 views
8

Estoy intentando crear un SyncAdapter para mi aplicación Android para mostrar videos de YouTube desde un canal específico. Los videos son de dominio público, por lo que no quiero que el usuario inicie sesión, cree una cuenta, se autentique, cargue datos o use 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 video más nuevos de ese canal. Ya construí un ContentProvider para acceder a mi base de datos. Me gusta el hecho de que SyncProvider manejará la capacidad de desactivar la sincronización, la programación y volver a intentar los mecanismos de reducción para la actualización.SyncAdapter sin una cuenta

Pregunté antes si un SyncAdapter era una buena opción para mi caso de uso, y me dijeron que sí. Vi el video de E/S de Google, leí los documentos, leí blogs ... (ver la lista a continuación). No he podido hacer que nada funcione. Lo mejor que he conseguido es tener la cuenta de SyncAdapter en la "Configuración de sincronización de Cuentas &" global, pero no ser 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 hubiera otra opción, siempre y cuando no necesiten acceder a ella para configurarla, ya que todo se configuraría automáticamente como sincronización automática una vez al día.

Incluso intenté usar el SampleSyncAdapter tal como está y puse puntos de interrupción en las secciones del código de Autenticación. No se golpea ni un solo punto de interrupción, así que no puedo ver qué desencadena las llamadas o qué datos contiene. Pensé que al menos podría obtener tanto.

Estoy empezando a pensar que usar 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 documentos completos, organizados y claros. Parece que debería ser una tarea común que muchas aplicaciones querrían hacer.

Por favor, 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 de otros casos de uso aquí, así que no pienses en cómo funcionó para tu caso de uso si no es como el mío.

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

Aquí lista de enlaces que he intentado en vano es, 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

http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/

http://www.c99.org/2010/01/23/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 without Authentication vs. Android Service

Why does ContentResolver.requestSync not trigger a sync?

+0

No es una pregunta duplicada pero relacionada [¿Debo usar android AccountManager?] (Http://stackoverflow.com/a/8614699/94363) – rds

Respuesta

6

En resumen, la respuesta es: ContentProvider, AccountManager y SyncAdapter van de la mano. Debes tener estas tres piezas, incluso si son "tontas".

+1

Y esto está en mi lista de [cosas que se encuentran en el marco de android ] (http://regis.decamps.info/blog/2011/08/my-life-with-android-its-complicated/) – rds

+0

Lo que no puedo entender es el lado de Account/AccountManager. Preferiría que la Cuenta no aparezca en la Configuración de Sincronización del Sistema ya que el usuario no debería necesitar ver esto. Incluso si tiene que estar allí (lo que parece ser cierto), lo que no puedo tener es que el usuario tenga que habilitar o configurar los ajustes de sincronización. Eso mataría la usabilidad de la aplicación. No puedo encontrar una manera de crear una cuenta que sea tan tonta como para no aparecer. ¿Cómo puedo hacer para que exista una cuenta que el usuario desconoce? – Mitch

+0

Sí, tiene que estar allí. ¿Por qué te molesta si la "Configuración> Cuentas y sincronización" muestra esto? Al menos, el usuario puede suspender la sincronización si quiere ahorrar batería. Además, si AccountManager es tonto, no es necesario que solicite al usuario que configure nada. Tal vez lo que te perdiste es que puedes registrar una cuenta en AccountManager mediante programación. – rds

5

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

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 Android API 5+.

Cuestiones relacionadas