【问题标题】:Android AccountManager's getAuthToken returns nullAndroid AccountManager 的 getAuthToken 返回 null
【发布时间】:2018-01-31 19:49:06
【问题描述】:

我目前正在尝试在我的项目中实施AccountManager。创建帐户效果很好,我可以毫无问题地访问 AuthToken

但是,一旦我刷新并更新 AccountManager 中的 AuthToken,我似乎无法再访问它,因为 AccountManager.getAuthToken() 每次都返回 null,我最终刷新了每次我尝试访问它时都会使用令牌。

这是我的getAuthToken() 方法:

public static String getAuthToken(final Context context)
{
    Log.d(TAG, "getAuthToken");
    AccountManager accountManager = AccountManager.get(context);
    String accountType = context.getResources().getString(R.string.account_type);
    Account accounts[] = accountManager.getAccountsByType(accountType);

    if (accounts.length == 0) {
        return null;
    }

    /* This method retrieves the token for the given account but doesn't pop the Authentication Page if not found */
    AccountManagerFuture<Bundle> futureBundle = accountManager.getAuthToken(accounts[0], AUTHENTICATION_TOKEN_TYPE, null, false, null, null);
    Bundle bundle;
    try {
        bundle = futureBundle.getResult();
    } catch (OperationCanceledException ex) {
        Log.wtf(TAG, "operation canceled: " + ex.getMessage());

        return null;
    } catch (IOException ex) {
        Log.wtf(TAG, "IOException: " + ex.getMessage());

        return null;
    } catch (AuthenticatorException ex) {
        throw new RuntimeException(ex.getMessage());
    }

    Log.d(TAG, "AccountManagerUtility getAuthToken: " + bundle.getString(AccountManager.KEY_AUTHTOKEN));
    return bundle.getString(AccountManager.KEY_AUTHTOKEN);
}

下面是更新 AccountManager 的方法:

public static void updateAccount(Context context, final OAuthToken authToken)
{
    AccountManager accountManager = AccountManager.get(context);
    String accountType = context.getResources().getString(R.string.account_type);
    Account accounts[] = accountManager.getAccountsByType(accountType);
    if (accounts.length == 0) {
        return;
    }

    accountManager.setAuthToken(accounts[0], AUTHENTICATION_TOKEN_TYPE, authToken.getAccessToken());
    accountManager.setPassword(accounts[0], authToken.getRefreshToken());

    final long timestamp = java.lang.System.currentTimeMillis();
    setRefreshTokenTimestamp(context, timestamp); // Updates User data
}

权限设置在AndroidManifest:

<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>

并且Authenticator也被定义了。实际上,在调用updateAccount 之后,正在调用Authenticator 的getAuthToken,这就是刷新令牌的方法。

感谢您的帮助。

【问题讨论】:

    标签: android oauth accountmanager android-5.1.1-lollipop


    【解决方案1】:

    使用此 cod 从您的应用帐户中获取身份验证令牌

    AccountManager accountManager=AccountManager.get(getContext());
        String     oAuth=accountManager.peekAuthToken(account,"oauth");
    

    accountManager.getAuthToken(accounts[0], AUTHENTICATION_TOKEN_TYPE, null, false, null, null);

    已弃用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 2011-09-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2012-06-22
      相关资源
      最近更新 更多