¿Android cómo realizar cualquier acción de ui desde SyncAdapter?
Frecuentes
Visto 364 veces
0
Completé todas las operaciones relacionadas con syncAdapter pero ahora estoy atascado en un problema menor
Token de autenticación
Después de 2 horas, mi token caducó y luego necesito mostrarle al usuario un cuadro de diálogo para ingresar su contraseña nuevamente para que pueda renovar su token.
AccountManager.get(getContext()).getAuthToken(account, LoginActivity.ACCOUNT_TYPE, null, false, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> arg0) {
try {
arg0.getResult();
} catch (OperationCanceledException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AuthenticatorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, null);
Estoy ejecutando esto en onPerformSync pero esto no está abriendo una actividad.
1 Respuestas
0
Hay dos partes para hacer esto
1) en tu AbstractThreadedSyncAdapter
implementación de anulado onPerformSync
método que necesita para
- Obtenga el código de autorización del
AccountManager
utilizando el métodoblockingGetAuthToken()
- Intente usar el código de autenticación para realizar sus procesos de sincronización (es decir, llamada de servicio web o lo que sea que lo use)
- Si el paso anterior falló porque el código de autenticación caducó (por ejemplo, su servicio web devuelve algún tipo de mensaje de código de autenticación caducado), entonces debe invalidar el código de autenticación a través del
AccountManager
utilizando el métodoinvalidateAuthToken()
2) en tu AbstractAccountAuthenticator
implementación de anulado getAuthToken()
Método
- Use el
AccountManager
para recuperar la contraseña que el usuario proporcionó por última vez e intente obtener un nuevo código de autenticación de su servicio web utilizando esas credenciales. - Si el paso anterior falló, agregue una intención de abrir su actividad de inicio de sesión al paquete que se devuelve desde el
getAuthToken()
método. Esto hará que se muestre la pantalla de inicio de sesión
Ejemplo
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse oResponse, Account oAccount, String strAuthTokenType, Bundle options)
throws NetworkErrorException {
// Validate the authentication type
if (!strAuthTokenType.equals("TODO: your auth token type URL here"))
{
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ERROR_MESSAGE, "invalid authTokenType");
return result;
}
// Try to get the password already stored in account manger, if there is one
final AccountManager oAccountManager = AccountManager.get(moContext);
final String strPassword = oAccountManager.getPassword(oAccount);
if (strPassword != null)
{
// TODO: Call the authentication web service method to get a fresh authcode
// Pass the strPassword and oAccount.name
Boolean blnVerified = //TODO: were the username + password authenticated?
String strNewAuthCode = //TODO: the new authcode returned by your authentication web service
// If it worked then return the result
if (blnVerified)
{
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, oAccount.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, "TODO: your account type URI here");
result.putString(AccountManager.KEY_AUTHTOKEN, strNewAuthCode);
return result;
}
}
// Password is missing or incorrect. Start the activity to ask user to provide the missing credentials.
// Open a UI form to get the user to input their username and password again
final Intent oIntent = new Intent(moContext, frmAccount_Auth.class);
oIntent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, oResponse);
final Bundle bundle = new Bundle();
bundle.putParcelable(AccountManager.KEY_INTENT, oIntent);
return bundle;
}
respondido 05 mar '14, 13:03
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas android synchronization or haz tu propia pregunta.