これまでのところ、アカウントを追加してトークンなどを取得できます。問題は、資格情報サーバー側を変更するときです。
資格情報が変更された場合にサーバーから通知を受け取ることができないため、トークンが有効でなくなったため、次の API 要求は拒否されます。
リクエストが拒否された後、2 つの理由が考えられます -> トークンの有効期限が切れているか、資格情報が無効になっています
これが発生すると、保存されたトークンを無効にして getAuthToken() を呼び出します
私の getAuthToken() では、最初に新しいトークンのリクエストを試みます。拒否された場合は、資格情報がもう問題ないことを意味するため、ログイン アクティビティを促す必要があります。問題は、 AccountAuthenticatorResponse.onError がエラーをログに記録することしかできないようで、それだけです。ログイン アクティビティの KEY_INTENT を含むバンドルを渡す AccountAuthenticatorResponse.onResult を使用しようとしましたが、何もしません。何かご意見は?
@Override
public Bundle getAuthToken(final AccountAuthenticatorResponse authenticatorResponse, final Account account,
final String authTokenType, Bundle bundle) throws NetworkErrorException {
//Get the account manager to access the account details
final AccountManager accountManager = AccountManager.get(mContext);
String authToken = accountManager.peekAuthToken(account, authTokenType);
//If auth token is null then try to log in the user with the stored credentials
//It could be that previous token has expired
if (authToken == null) {
final String password = accountManager.getPassword(account);
final String clientID = accountManager.getUserData(account, CLIENT_ID_KEY);
final String apiSecret = accountManager.getUserData(account, API_SECRET_KEY);
final String serverUrl = accountManager.getUserData(account, SERVER_ADDRESS_KEY);
if (password != null && clientID != null && apiSecret != null && serverUrl != null) {
Logger.log(LOG_TAG, "Requesting new token...", Log.VERBOSE);
ApiRequestManager.getInstance(mContext)
.getToken(serverUrl, clientID, apiSecret, account.name, password,
new NetworkCallBack() {
@Override
public void tokenReceived(Token JsonToken) {
//Credentials still valid, token received
//Returning data back to the account authenticator
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, JsonToken.getAccess_token());
authenticatorResponse.onResult(result);
}
@Override
public void errorReceivingToken(VolleyError errorResponse) {
//If we are here with error 400 it only means credentials have changed
//I should prompt LogIn activity at this point
if (errorResponse.networkResponse.statusCode == 400) {
Bundle loginActivityBundle =
promptLoginActivity(authenticatorResponse, account.type, authTokenType, null);
// AuthenticatorResponse.onResult(loginActivityBundle); AuthenticatorResponse.onError(errorResponse.networkResponse.statusCode、「エラー」);
}
}
});
return null;
}
}
//If we got an authToken return the account and login info in a bundle
if (authToken != null) {
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
return result;
}
//If we are here then means either we do not have an account signed
//or credentials are no longer valid -> prompt login procedure again
return promptLoginActivity(authenticatorResponse, account.type, authTokenType, null);
}