【问题标题】:GoogleAuthUtil.getToken() blocksGoogleAuthUtil.getToken() 块
【发布时间】:2015-03-28 14:08:12
【问题描述】:

我正在尝试在我的 Android 应用程序中检索已登录用户的 Google Plus 访问令牌。我正在使用以下代码执行此操作,该代码遵循 hereherehere 提出的建议:

private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        int REQUEST_CODE_TOKEN_AUTH = 466453; // Any number, not really using it anyway.
        String accountName = params[0];
        String scopes = "oauth2:" + Plus.SCOPE_PLUS_LOGIN;
        String token = null;
        try {
            token = GoogleAuthUtil.getToken(getActivity(), accountName, scopes);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
        } catch (UserRecoverableAuthException e) {
            startActivityForResult(e.getIntent(), REQUEST_CODE_TOKEN_AUTH);
        } catch (GoogleAuthException e) {
            Log.e(TAG, e.getMessage());
        }

        return token;
    }
}

我这样称呼它:

@Override
public void onConnected(Bundle connectionHint) {
    mSignInClicked = false;

    Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);

    try {
        String accessToken = (new RetrieveTokenTask()).execute(Plus.AccountApi.getAccountName(mGoogleApiClient)).get();
    } catch (Exception ex) {
        Log.e(TAG, ex.getMessage());
    }
}

我在我的 AndroidManifest(以及其他)中拥有以下权限:

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

问题是当调用GoogleAuthUtil.getToken() 时,没有任何进展,它会在那里冻结。我该如何解决这个问题?

【问题讨论】:

    标签: android google-plus google-plus-signin


    【解决方案1】:

    问题是调用GoogleAuthUtil.getToken()时,有 没有任何进展,它会在那里冻结。

    因为您正在调用 get() 方法 AsyncTask 这使得主 UI 线程等到 doInBackground 计算未完成

    我该如何解决这个问题?

    通过调用execute方法执行AsyncTask并使用onPostExecute获取accessToken

    【讨论】:

    • 这只是一个快速尝试,以确保令牌检索工作正常。我会在解决这个问题后更新它,但真正的问题是为什么 getToken() 方法没有任何进展?
    • @VladSchnakovszki:首先删除get()方法然后检查它
    • @VladSchnakovszki: 还要确保 INTERNET 权限也可用
    • 好的,解决了它..没想到会这样。如果您可以详细说明您的答案,为什么会发生这种情况,我会将其授予接受的答案。谢谢!
    • @VladSchnakovszki:我的回答已经很详细了。应用程序冻结是因为当我们调用AsyncTask 的get 方法时,系统会阻止控制,直到doInBackground 计算未完成但没有get 方法doInBackground 在后台线程中运行而不会阻塞主ui 线程的执行以及doInBackground 方法执行时完成系统调用onPostExecute 方法,通知主ui 线程doInBackground 方法执行完成。有关更多详细信息,请参阅AsyncTask
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2014-01-31
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多