¿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()
- Cómo moverse repetición similar-variable en declaraciones if
- Buena ingeniería de software vs. seguridad
- Fusionar dos archivos WAVE en Android (concatenar)
- ¿Cómo acceder / carpeta de datos de otra aplicación a través de su aplicación?
- Androide. Reemplazar * carácter de cadena
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); }
- Laggy proyecto vacío a 60FPS
- ¿Cómo puedo interceptar el flujo de audio en un dispositivo Android?
- ¿Cuál es la manera optimizada?
- OR cláusula en firebase java android
- Actualización de contenido de ScrollView
- La compilación del proyecto Android se ejecutó correctamente pero se ejecutó con error: java.util.zip.ZipException: entrada duplicada
- Cómo deshabilitar el teclado virtual en WebView
- Cómo obtener la ubicación GPS de Android
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);
- ¿Puedo hacer que IntelliJ depure mis aplicaciones Android a través del dispositivo en lugar del emulador?
- No se puede registrar el receptor dinámicamente