Search code examples
androidgoogle-plusdeadlockaccess-token

"Calling this from your main thread can lead to deadlock and/or ANRs while getting accesToken" from GoogleAuthUtil(Google Plus integration in Android)


In my android application, I am trying to get AccessToken from GoogleAuthUtil as below :

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

But At this line I am gettting error as below :

E/GoogleAuthUtil(4696): Calling this from your main thread can lead to deadlock and/or ANRs E/GoogleAuthUtil(4696): java.lang.IllegalStateException: calling this from your main thread can lead to deadlock E/GoogleAuthUtil(4696): at com.google.android.gms.auth.GoogleAuthUtil.b(Unknown Source) E/GoogleAuthUtil(4696): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) E/GoogleAuthUtil(4696): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)

Any solution of this problem? Any help will be appreciated.


Solution

  • Try it with an AsyncTask like this:

            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 is a space separated list of OAuth 2.0 scope strings. For example SCOPES could be defined as:

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

    These represent the permissions that your app is requesting from the user. The scopes requested in this example are documented here: