20

私のAndroidアプリケーションでは、以下のようにGoogleAuthUtilからAccessTokenを取得しようとしています:

accessToken = GoogleAuthUtil.getToken(this, mPlusClient.getAccountName(), "oauth2:" + SCOPE);

しかし、この行では、以下のようなエラーが発生しています:

E/GoogleAuthUtil(4696): メイン スレッドからこれを呼び出すと、デッドロックや ANR が発生する可能性があります E/GoogleAuthUtil(4696): java.lang.IllegalStateException: メイン スレッドからこれを呼び出すと、デッドロックが発生する可能性があります E/GoogleAuthUtil(4696) : com.google.android.gms.auth.GoogleAuthUtil.b(不明なソース) E/GoogleAuthUtil(4696): com.google.android.gms.auth.GoogleAuthUtil.getToken(不明なソース) E/GoogleAuthUtil(4696) : com.google.android.gms.auth.GoogleAuthUtil.getToken (不明なソース) で

この問題の解決策はありますか? どんな助けでも大歓迎です。

4

4 に答える 4

44

次のような AsyncTask で試してください。

        AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... params) {
                String token = null;

                try {
                    token = GoogleAuthUtil.getToken(
                            MainActivity.this,
                            mGoogleApiClient.getAccountName(),
                            "oauth2:" + SCOPES);
                } catch (IOException transientEx) {
                    // Network or server error, try later
                    Log.e(TAG, transientEx.toString());
                } catch (UserRecoverableAuthException e) {
                    // Recover (with e.getIntent())
                    Log.e(TAG, e.toString());
                    Intent recover = e.getIntent();
                    startActivityForResult(recover, REQUEST_CODE_TOKEN_AUTH);
                } catch (GoogleAuthException authEx) {
                    // The call is not ever expected to succeed
                    // assuming you have already verified that 
                    // Google Play services is installed.
                    Log.e(TAG, authEx.toString());
                }

                return token;
            }

            @Override
            protected void onPostExecute(String token) {
                Log.i(TAG, "Access token retrieved:" + token);
            }

        };
        task.execute();

SCOPESOAuth 2.0 スコープ文字列のスペース区切りのリストです。たとえば、SCOPES次のように定義できます。

public static final String SCOPES = "https://www.googleapis.com/auth/plus.login "
    + "https://www.googleapis.com/auth/drive.file";

これらは、アプリがユーザーに要求しているアクセス許可を表します。この例で要求されたスコープは、次のドキュメントに記載されています。

于 2013-07-09T12:12:57.503 に答える