3

Android デバイスに保存されている Google アカウントから新しいトークンを取得しようとしていますが、取得したのは、過去数日間キャッシュしてきたものと同じ古いトークンだけです。電話のどこかにキャッシュされているようで、インターネットリクエストも送信されていません(インターネットに接続せずにアプリでテストを行い、同じトークンが返されます)。

frominvalidateAuthTokenで新しいメソッドを取得する前に、このメソッドを使用しました。見てください:getResultAccountManagerFuture

public String updateToken(Activity activity) throws Exception {             
    AccountManager am = AccountManager.get(activity);
    Account[] accounts = am.getAccountsByType("com.google");

    if (accounts == null || 
        accounts.length == 0 || 
        "".equals(accounts[0].name.trim())) 
    {
        throw new Exception("Não há contas Google configuradas no smartphone.");
    } 
    else if (!"crsilva@gmail.com".equals(accounts[0].name.trim()) && 
             !"cristiano.bezerra@sulamerica.com.br".equals(accounts[0].name.trim()) &&
             !"tholiver@gmail.com".equals(accounts[0].name.trim())) 
    {
        Log.w("Util.updateToken","conta obtida: " + accounts[0].name);
        throw new Exception("Conta Google não autorizada.");
    }
    Log.w("Util.updateToken","conta obtida: " + accounts[0].name);
    am.invalidateAuthToken("com.google", null);
    Log.w("Util.updateToken","Passou do invalidateAuthToken");
    AccountManagerFuture<Bundle> future = 
        am.getAuthToken(accounts[0], "ah", null, activity, null, null);
    Log.w("Util.updateToken","Passou do getAuthToken");
    Bundle bundle = future.getResult();
    Log.w("Util.updateToken","Passou do getResult");
    future = null;
    am = null;
    accounts = null;
    String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
    Log.w("Util.updateToken","Token: " + authToken);
    return authToken;
}

シングルトン インスタンスによって Util クラスからこのメソッドを呼び出したスレッド。マニフェストには、必要なすべてのアクセス許可があります。トークンが更新されない理由を知っている人はいますか?

4

2 に答える 2

7

認証トークンを無効にするには、無効にするトークンをinvalidateAuthTokenの2番目の引数として渡す必要があります。このブログ投稿のセクション「4.4.3認証トークンの無効化」を参照してください。そのページのビデオも役に立ちます。

invalidateAuthTokenのドキュメントには、2番目の引数がnullになる可能性があると記載されていますが、これはnullを指定してこのメ​​ソッドを呼び出すことが許可されていることを意味するだけであり、nullが渡された場合にキャッシュされたすべてのトークンが無効になるわけではありません。

代わりにこのようなことをすると、コードは機能するはずです。

// Get token
AccountManagerFuture<Bundle> future = am.getAuthToken(accounts[0], "ah", null, activity, null, null);
Bundle bundle = future.getResult();
String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

// invalidate the token since it may have expired.
am.invalidateAuthToken("com.google", authToken);

// Get token again
future = am.getAuthToken(accounts[0], "ah", null, activity, null, null);
bundle = future.getResult();
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
于 2012-11-27T07:24:49.530 に答える
6

現在キャッシュされているトークンを単純に「覗いて」、それがまだ有効かどうかを確認し、必要に応じて新しいトークンを作成する方が簡単です。

String authToken = accountManager.peekAuthToken(account, Constants.AUTHTOKEN_TYPE);
// validate the token, invalidate and generate a new one if required
accountManager.invalidateAuthToken(Constants.ACCOUNT_TYPE, authToken);
accountManager.blockingGetAuthToken(account,
                Constants.AUTHTOKEN_TYPE, NOTIFY_AUTH_FAILURE);
于 2013-10-06T09:13:24.763 に答える