it-swarm.com.de

"Das Aufrufen von Ihrem Haupt-Thread aus kann zu Deadlock und/oder ANRs führen, während Sie accesToken erhalten" von GoogleAuthUtil (Google Plus-Integration in Android)

In meiner Android-Anwendung versuche ich, AccessToken von GoogleAuthUtil wie folgt abzurufen:

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

Bei dieser Zeile erhalte ich jedoch einen Fehler wie folgt:

E/GoogleAuthUtil (4696): Das Aufrufen aus Ihrem Haupt-Thread kann zu Deadlock und/oder ANRs E/GoogleAuthUtil (4696) führen: Java.lang.IllegalStateException: Das Aufrufen aus Ihrem Haupt-Thread kann zu Deadlock führen. .____.] E/GoogleAuthUtil (4696): um com.google.Android.gms.auth.GoogleAuthUtil.b (unbekannte Quelle) E/GoogleAuthUtil (4696): um com.google.Android.gms. auth.GoogleAuthUtil.getToken (unbekannte Quelle) E/GoogleAuthUtil (4696): um com.google.Android.gms.auth.GoogleAuthUtil.getToken (unbekannte Quelle)

Irgendwelche Lösung für dieses Problem? Jede Hilfe wird geschätzt.

17
Ponting

Versuchen Sie es mit einer AsyncTask wie folgt:

        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 ist eine durch Leerzeichen getrennte Liste von OAuth 2.0-Bereichszeichenfolgen. Zum Beispiel könnte SCOPES definiert werden als:

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

Diese stellen die Berechtigungen dar, die Ihre App vom Benutzer anfordert. Die in diesem Beispiel angeforderten Bereiche sind hier dokumentiert:

40
Lee

Verwenden Sie einen separaten Thread für Ihren Internetcode. Fehler sagt, dass ein zeitaufwendigerer Prozess läuft in der App und hier ist das Internet. Verwenden Sie also einen separaten Thread oder einen Async-Task.

Schauen Sie sich diesen Link an NetworkOnMainThreadException

Ich hoffe es wird dir helfen.

4
Rushabh Patel

E/GoogleAuthUtil (4696): Java.lang.IllegalStateException: Das Aufrufen von Von Ihrem Haupt-Thread aus kann zu einem Deadlock führen

Klingt, als müsstest du das in einem separaten Thread machen, hast du das probiert?

Hier finden Sie Informationen zu Threads in 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