¿Android cómo realizar cualquier acción de ui desde SyncAdapter?

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.

preguntado el 22 de noviembre de 13 a las 15:11

1 Respuestas

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étodo blockingGetAuthToken()
  • 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étodo invalidateAuthToken()

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 or haz tu propia pregunta.