web-dev-qa-db-fra.com

"Appeler cela depuis votre thread principal peut être bloqué ou bloqué par un accès" à partir de GoogleAuthUtil (intégration de Google Plus dans Android)

Dans mon application Android, j'essaie d'obtenir AccessToken à partir de GoogleAuthUtil comme ci-dessous:

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

Mais à cette ligne je reçois une erreur comme ci-dessous:

E/GoogleAuthUtil (4696): appeler ceci depuis votre thread principal peut conduire à un blocage et/ou à des ANR E/GoogleAuthUtil (4696): Java.lang.IllegalStateException: appeler ceci depuis votre thread principal peut conduire à un blocage .____.] E/GoogleAuthUtil (4696): sur com.google.Android.gms.auth.GoogleAuthUtil.b (Source inconnue) E/GoogleAuthUtil (4696): sur com.google.Android.gms. auth.GoogleAuthUtil.getToken (Source inconnue) E/GoogleAuthUtil (4696): sur com.google.Android.gms.auth.GoogleAuthUtil.getToken (Source inconnue)

Une solution à ce problème? Toute aide serait appréciée.

17
Ponting

Essayez avec une AsyncTask comme ceci:

        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 est une liste de chaînes de portée OAuth 2.0, séparées par un espace. Par exemple, SCOPES pourrait être défini comme suit:

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

Celles-ci représentent les autorisations que votre application demande à l'utilisateur. Les portées demandées dans cet exemple sont documentées ici:

40
Lee

Utilisez un fil séparé pour votre code Internet. Une erreur indique que un processus plus long est en cours d'exécution dans l'application et ici, c'est Internet. Utilisez donc une tâche distincte ou une tâche asynchrone.

Consultez ce lien NetworkOnMainThreadException

J'espère que cela vous aidera.

4
Rushabh Patel

E/GoogleAuthUtil (4696): exception Java.lang.IllegalStateException: appeler cette Depuis votre thread principal peut mener à un blocage

On dirait que vous devez le faire sur un fil séparé, avez-vous essayé?

Ici vous pouvez trouver des informations sur les discussions dans 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
Luis Jose Salzana