¿Por qué no se llama AccountAuthenticator # getAuthToken ()?

He creado mi propio autenticador de cuentas de Android extendiendo AbstractAccountAuthenticator e implementando addAccount() y getAuthToken() . Algunos de los métodos en él son llamados por AccountManager , pero otros no lo son.

Esto funciona muy bien:

AccountManager#addAccount()

 AccountManager accountManager = AccountManager.get(activity); accountManager.addAccount(MyAccountAuthenticator.ACCOUNT_TYPE, MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, null, activity, callback, null); 

El problema ocurre cuando llamo a AccountManager#getAuthToken() en mi Activity . AccountManager no llama al método getAuthToken() que defino en mi AccountAuthenticator . Llama a otro método predeterminado que sólo comprueba la existencia de un authToken antes de iniciar AuthenticatorActivity .

Esto no funciona. No llama a mi método getAuthToken() :

AccountManager#getAuthToken()

 AccountManager accountManager = AccountManager.get(activity); accountManager.getAuthToken( mAccount, MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, activity, callback, handler); 

AuthenticatorService

onBind() mi servicio y onBind() . addAccount() no debería funcionar de lo contrario.

 public IBinder onBind(Intent intent) { return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? new MyAccountAuthenticator(this).getIBinder() : null; } 

EDIT: Llamar addAccountExplicitly en MyAuthenticatorActivity después de que la aplicación obtiene un token de autorización para el usuario.

Snippet de la clase MyAuthenticatorActivity extends AccountAuthenticatorActivity :

 if (getIntent().getBooleanExtra(KEY_IS_ADDING_NEW_ACCOUNT, false)) { // Creating the account on the device and setting the auth token we recieved accountManager.addAccountExplicitly(account, null, null); } 

Su comentario aclaró las cosas inmensamente – si establece el token de autenticación para la cuenta, entonces su método getAuthToken no será llamado hasta que el token sea invalidado. Por lo general, hace esto llamando a invalidateAuthToken al recibir un 401 o 403 o lo que tiene del servicio web.

Desde el Javadoc para los métodos getAuthToken :

Si se almacena en caché un token de autenticación previamente generado para esta cuenta y tipo, se devuelve. De lo contrario, si una contraseña guardada está disponible, se envía al servidor para generar un nuevo token de autenticación. De lo contrario, se le pedirá al usuario que introduzca una contraseña.

Puesto que su token está en la memoria caché, se devuelve directamente y su autenticador no se consulta.

Para llamar a AuthenticatorActivity en el método AccountManager # getAuthToken, debe enviar la intención a la actividad por método parcelable, por ejemplo:

  final Intent intent = new Intent(mContext, LoginActivity.class); intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, accountAuthenticatorResponse); intent.putExtra(LoginActivity.ARG_ACCOUNT_TYPE, account.type); intent.putExtra(LoginActivity.ARG_AUTH_TYPE, authTokenType); intent.putExtra(LoginActivity.ARG_ACCOUNT_NAME, account.name); final Bundle bundle = new Bundle(); bundle.putParcelable(AccountManager.KEY_INTENT, intent); 
  • Aviary para Android - Cómo forzar la imagen de la cosecha usando editor.launch
  • ¿Cuáles son las maneras de generar programáticamente conjuntos de colores de Material Design?
  • Cómo obtener valor almacenado en ArrayList <HashMap <clave, valor >>?
  • ¿Cuál es el propósito de `convertView` en el adaptador ListView?
  • Cómo mostrar el pin de ubicación de la parte visible de un mapview en android?
  • WebDriver de Android. XMLHttpRequest no puede cargar 'URL'. Origen 'URL' no está permitido por Access-Control-Allow-Origin. En null: 1
  • Dispositivos Android conectados con NSD, cómo enviar mensajes utilizando sockets (Client-Client)?
  • ¿Cómo deslizar la imagen con el toque de dedo en Android?
  • StrictMode se queja de que InputStream no esté cerrado
  • Necesidad de formatear moneda para TextView
  • Un entorno de ejecución Java (JRE) o Java Development Kit (JDK) debe estar disponible para ejecutar Eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.