web-dev-qa-db-ja.com

GoogleAuthUtilから「メインスレッドからこれを呼び出すと、accesTokenの取得中にデッドロックやANRが発生する可能性があります」(AndroidでのGoogle Plusの統合)

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

accessToken = GoogleAuthUtil.getToken(this、mPlusClient.getAccountName()、 "oauth2:" + SCOPES);

しかし、この行で私は以下のようにエラーを取得しています:

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

この問題の解決策はありますか?どんな助けでもありがたいです。

19
Ponting

次のような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();

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

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

これらは、アプリがユーザーに要求する権限を表します。この例でリクエストされているスコープは次のとおりです。

42
Lee

インターネットコードには別のスレッドを使用してください。エラーは、より多くの時間のかかるプロセスがアプリ(ここではインターネット)で実行されていることを示しています。したがって、別のスレッドまたは非同期タスクを使用してください。

このリンクをチェックしてください NetworkOnMainThreadException

それがあなたを助けることを願っています。

4
Rushabh Patel

E/GoogleAuthUtil(4696):Java.lang.IllegalStateException:メインスレッドからこれを呼び出すと、デッドロックが発生する可能性があります

別のスレッドでそれを行う必要があるように聞こえますが、それを試しましたか?

ここ Androidのスレッドに関する情報を見つけることができます。

0
Anton Aderum
            Thread CrearEventoHilo = new Thread(){
                public void run(){
                    //do something that retrun "Calling this from your main thread can lead to deadlock"
                }
            };
            CrearEventoHilo.start();

CrearEventoHilo.interrupt();

public class Foo {
    MyThread mTh;
    void cantBeBothered() {
        mTh = new MyThread( /*...*/ );
        mTh.run();
        mTh.start();
    }
    void imFinishedNowWaitingForThread() {
        mTh.join();
    }
    void imOutKillingOffPendingThread()  {
        mTh.interrupt();
    }
//  .....
    private class MyThread extends Thread {
//      ...;
        MyThread( /*...*/) {
//          this... = ...;
        }
        public void run() {
            doSomething( /*this...*/ );
        }
    }
}
0