20

在我的 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(未知来源) 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();

SCOPES是 OAuth 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 回答
4

为您的互联网代码使用单独的线程。错误告诉应用程序中正在运行更耗时的过程,这里是互联网。所以使用单独的线程或异步任务。

查看此链接NetworkOnMainThreadException

希望它会帮助你。

于 2013-07-09T11:30:32.157 回答
0

E/GoogleAuthUtil(4696): java.lang.IllegalStateException: 从你的主线程调用它会导致死锁

听起来您需要在单独的线程上执行此操作,您尝试过吗?

在这里您可以找到有关 Android 中线程的信息。

于 2013-07-09T11:29:37.483 回答
0
            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...*/ );
        }
    }
}
于 2017-03-27T10:29:44.760 回答