Как должно реагировать приложение, если authToken становится недействительным

в моем проекте мне нужно регулярно подключаться к серверу. Поэтому я реализую AccountAuthenticator и SyncAdapter, чтобы подключить их к платформе Android. Для приложения очень важно регулярно подключаться, скажем, каждые 5 или 10 минут.

Независимо от того, сохраняю ли я пароль или authToken, оба могут стать недействительными, и SyncAdapter больше не сможет синхронизироваться. Логично, что пользователь должен быть проинформирован.

Я хотел отобразить форму входа, если AccountAuthenticator.getAuthToken(..) не может получить новый authToken:

@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response,
                           Account account, String authTokenType,
                           Bundle options) throws NetworkErrorException {
    // code derived from SampleSyncAdapter

    // If the caller requested an authToken type we don't support, then
    // return an error
    if (!authTokenType.equals(Helper.ACCOUNT_TYPE)) {
        final Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ERROR_MESSAGE,
                         "invalid authTokenType");
        return result;
    }

    // Extract the username and password from the Account Manager, and ask
    // the server for an appropriate AuthToken.
    final AccountManager am = AccountManager.get(context);
    final String password = am.getPassword(account);
    if (password != null) {
        final LoginData loginData =
                           NetworkUtility.authenticate(account.name, password);

        if (loginData.wasSuccessful() &&
            !TextUtils.isEmpty(loginData.getAuthenticationToken())) {
            final Bundle result = new Bundle();
            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
            result.putString(AccountManager.KEY_ACCOUNT_TYPE,
                             Helper.ACCOUNT_TYPE);
            result.putString(AccountManager.KEY_AUTHTOKEN,
                             loginData.getAuthenticationToken());
            return result;
        }
    }

    // If we get here, then we couldn't access the user's password - so we
    // need to re-prompt them for their credentials. We do that by creating
    // an intent to display our AuthenticatorActivity panel.
    final Intent intent = new Intent(context, AuthenticatorActivity.class);
    intent.putExtra(AuthenticatorActivity.PARAM_USERNAME, account.name);
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
                    response);
    final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
}

но, к сожалению, это не работает, приглашение не создается.

Я не нашел никакой информации о том, что было бы наилучшей практикой. Я проверил новое приложение CouchSurfing, и они просто удалили учетную запись. Я не проверял сейчас, но я думаю, что Google отключит синхронизацию. Ни одно из решений не подойдет для моего варианта использования.


person Adam    schedule 16.08.2014    source источник


Ответы (1)


Решение проще, чем я думал, и Google также делает это:

Разместите сообщение в области уведомлений (http://developer.android.com/guide/topics/ui/notifiers/notifications.html), и при его открытии может отображаться экран входа в систему.

person Adam    schedule 24.08.2014