2011-03-14 33 views
8

He integrado la administración de cuentas de Android en mi aplicación y puedo administrar cuentas desde la configuración Accounts & Sync.Manejo de inicio de sesión y recordarme con el AccountManager

Quiero tener la actividad de inicio de sesión clásica que reenvía al usuario a su actividad de inicio en el inicio de sesión con éxito, con la opción de recordar la contraseña del usuario. Sin embargo, el AccountAuthenticatorActivity debe devolver su resultado al AccountManager con las credenciales y el resto de la información de cuenta, llamando a un finish() explícito y devolviendo el intento.

¿Cómo puedo dar al AccountManager la información que necesita sin tener que tener finish() mi actividad de inicio de sesión?

+0

¿Así que finalmente logró manejar el inicio de sesión y me recuerda con el AccountManager? He estado luchando con mi flujo de aplicaciones por eso. Deseo activar AccountAuthenticatorActivity cuando inicio mi aplicación solo si no hay una cuenta en el dispositivo, pero no logro obtener un flujo de "mejores prácticas" para hacerlo correctamente. – CinetiK

Respuesta

19

AccountManager no debe ser llamado por una aplicación interactiva, sino por un Adaptador de sincronización. (Un gran tutorial es "¿Has ganado embargo» Escribir un proveedor de Android Sync?" Part 1 y Part 2 que da grandes ejemplos de código, pero que no lo hacen tan gran trabajo de explicar el flujo de datos.) Es como esto:

Desarrolla un ContentProvider que envuelve una base de datos. Crea un SyncAdapter (este es un servicio en segundo plano) para conectarse a un servidor y obtener datos y sincronizar ContentProvider para que coincida con el servidor. Luego, su UI consulta al ContentProvider para mostrar los datos obtenidos. Hay algunos métodos para consultar directamente información específica también, si desea buscar y almacenar en caché los resultados, por ejemplo. Vea Developing RESTful Android Apps para una buena sesión de una hora sobre cómo debería verse el modelo de datos. Ofrecen tres ejemplos de arquitectura, comenzando con una implementación "ingenua" que luego progresa al modelo SyncAdapter apropiado.

En cuanto a la autenticación en sí misma, la forma en que SyncAdapter usa el AccountManager es para obtener un token de autenticación. Este es (a menudo) un gran valor hexadecimal, que se pasa como parte de los encabezados HTML en lugar de un par de nombre de usuario/contraseña. Piense en ello como una clave única de una sesión. La posesión de la clave es una prueba de autenticación y caducan periódicamente. Cuando caducan, vuelves a autenticarte y traes uno nuevo. SyncAdapater le pide a AccountManager un token de autenticación para una combinación específica de tipo de cuenta/nombre de usuario. AccountManager se auths con el servidor (pidiendo al usuario una nueva contraseña si es necesario debido a un cambio) y devuelve el token a SyncAdapter, que lo usa a partir de ese momento.

Si este modelo no es apropiado para su aplicación, debe manejar manualmente el inicio/cierre de sesión en el código de su aplicación. Una especie de dolor, lo sé.

+0

Actualmente tengo una configuración como la que mencionaste, con el proveedor de contenido envolviendo el archivo db y usando adaptadores de sincronización (¡que Google IO habla sobre las rocas!). Solo intento reutilizar mi AccountAuthenticatorActivity para manejar inicios de sesión regulares. Los tutoriales "¿Ganaste todavía? ..." agregan las interacciones de AccountManager a una pantalla de inicio de sesión existente (aunque no muestran el código completo), así que supongo que podría haber una alternativa para usar la misma actividad. – mgv

+0

Bien, bien. Entonces, el código de ejemplo muestra una pantalla de inicio de sesión, pero al igual que las otras cuentas (cuenta de Google, cuenta de Facebook, etc.) la pantalla se muestra en el panel de control Cuentas y Sincronización, no desde su aplicación. (Intente encontrar un lugar para ingresar una contraseña en la aplicación gmail de Android ... ¡No puede! Solo a través de Cuentas y sincronización). Entonces, el modelo aquí es que ingrese su contraseña en la página de control de A & S, y luego su aplicación le pregunta al Autentificador de cuenta cómo ingresar al servidor. Authenticator proporciona un authToken a su SyncAdapater y SyncAdapter proporciona authToken al servidor para autenticarse. – jcwenger

+0

Bueno, con más precisión, puede agregar una cuenta, pero lo hace llamando a un intento de iniciar la actividad Cuentas y sincronización "Crear cuenta", no llamando directamente a AccountAuthenticator ... Y una vez que se crea la cuenta, es esperando a que SyncAdapter haga el trabajo sucio, como en tu caso. – jcwenger

11

@jcwenger Eso no es del todo correcto. También puede usar el AccountManager desde una aplicación interactiva. Por ejemplo, puede agregar cuentas sin invocar la interfaz del administrador de cuentas mediante el método AccountManageraddAccountExplicitly().

En "¿Ya ganaste?" En el artículo, puede ver claramente que el administrador de cuenta se invoca desde el propio Activity de la aplicación. Esto es útil si la aplicación tiene su propia interfaz de administración de cuentas.

1

Mi versión del 'flujo clásico' usando AccountManager:

uso mi AuthenticatorActivity tanto para el caso normal en el que se utiliza a través. Cuentas & Configuración de sincronización, pero también la abro para que la usen aplicaciones que dependen de las mismas cuentas. Tengo una aplicación independiente con el autenticador implementado y otras aplicaciones (por separado) que dependen de estas cuentas.

casos manejados:

  • el caso normal: el usuario agrega/autentique a través. Cuentas & Sincronización (según el proyecto de ejemplo de Android)

  • gestionar las solicitudes de autenticación de aplicaciones externas: ¿Cómo? Proporciono un filtro de intención en el Manifiesto de la aplicación Authenticator para que otras aplicaciones puedan crear una instancia de AuthenticatorActivity a través de. startActivityForResult (deben incluir un intento adicional que indique quiénes son (el paquete de su aplicación)). En AuthenticatorActivity detecto este caso y me abstengo de llamar a setAccountAuthenticatorResult cuando el proceso de autenticación ha llegado a su fin porque reservé su uso para el caso normal anterior. El usuario ingresa sus credenciales y presiona Iniciar sesión: AccountManger se marca para una cuenta coincidente y si coincide I , persista el nombre de usuario de esa cuenta como el usuario activo para el paquete de la aplicación que realiza la llamada. Luego devuelvo un intento a la aplicación de llamada a través de. setResult que indica el éxito, el nombre de usuario y el tipo de cuenta. En el caso donde la Cuenta no existía, realizo el proceso que atraviesa el caso normal, es decir, llamo addAccountExplicitly y luego configuro el usuario activo y luego como antes de llamar a setResult y finalizar.

Espero que esto ayude a alguien.

Cuestiones relacionadas