首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AccountManager的getAuthToken返回null

AccountManager的getAuthToken返回null
EN

Stack Overflow用户
提问于 2017-03-20 20:59:52
回答 1查看 2.8K关注 0票数 2

我目前正在尝试在我的项目中实现AccountManager。创建帐户运行良好,我可以毫无问题地访问AuthToken。

但是,一旦刷新和更新了AuthToken中的AccountManager,我似乎就不能再访问它了,因为AccountManager.getAuthToken()每次返回null,每次尝试访问它时都会刷新令牌。

下面是我的getAuthToken()方法:

代码语言:javascript
复制
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的方法:

代码语言:javascript
复制
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中设置。

代码语言:javascript
复制
<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"/>

并定义了身份验证器。实际上,在调用updateAccount之后,将调用身份验证器的getAuthToken,这是刷新令牌的方法。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-01-31 11:49:06

使用以下代码从应用程序的帐户获取AuthToken:

代码语言:javascript
复制
AccountManager accountManager=AccountManager.get(getContext());
    String     oAuth=accountManager.peekAuthToken(account,"oauth");

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

现在不受欢迎了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42913873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档