в моем проекте мне нужно регулярно подключаться к серверу. Поэтому я реализую 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 отключит синхронизацию. Ни одно из решений не подойдет для моего варианта использования.