2013-11-22 2 views
0

Я выполнил все операции, связанные с SyncAdapter, но теперь им застрял на одном второстепенном вопросеAndroid как выполнить любое действие ui от SyncAdapter?

Auth Токен

После 2ч мой маркер просто истек, а затем мне нужно, чтобы показать пользователю диалоговое окно, снова ввести свой пароль так что он может возобновить свой токен.

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); 

Я выполняю это on onPerformSync, но это не открывает активность.

ответ

0

Есть две части, чтобы делать это

1) в вашем AbstractThreadedSyncAdapter реализации переопределенного onPerformSync метода необходимо

  • Получить код авторизации от AccountManager с использованием метода blockingGetAuthToken()
  • Попробуйте использовать authcode для выполнения ваших процессов синхронизации (т. е. вызов веб-службы или все, что вы используете для него)
  • Если предыдущий шаг завершился неудачно, поскольку authcode имеет значение expir (например, Ваш веб-имя_служба возвращает какие-коду авторизации истекла сообщение), то вам необходимо аннулировать код авторизации через AccountManager с использованием метода invalidateAuthToken()

2) в вашем AbstractAccountAuthenticator реализации переопределено getAuthToken() метод

  • Используйте AccountManager для получить пароль, который последний предоставил пользователю, и попытаться получить новый код аутентификации с веб-службы, используя эти учетные данные.
  • Если предыдущий шаг не удался, добавьте намерение открыть свою активность входа в пакет, который возвращается из метода getAuthToken(). Это заставит Логин экрана для отображения

Пример

@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; 
} 
Смежные вопросы