"Вызов этого из основного потока может привести к взаимоблокировке и/или ANR при получении accesToken" от GoogleAuthUtil (интеграция с Google Plus в Android) - программирование
Подтвердить что ты не робот

"Вызов этого из основного потока может привести к взаимоблокировке и/или ANR при получении accesToken" от GoogleAuthUtil (интеграция с Google Plus в Android)

В моем приложении для Android я пытаюсь получить AccessToken из GoogleAuthUtil, как показано ниже:

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

Но в этой строке я получаю ошибку, как показано ниже:

E/GoogleAuthUtil (4696): вызов этого из основного потока может привести к взаимоблокировке и/или ANR   E/GoogleAuthUtil (4696): java.lang.IllegalStateException: вызов этого из основного потока может привести к взаимоблокировке   E/GoogleAuthUtil (4696): at com.google.android.gms.auth.GoogleAuthUtil.b(Неизвестный источник)   E/GoogleAuthUtil (4696): в com.google.android.gms.auth.GoogleAuthUtil.getToken(Неизвестный источник)   E/GoogleAuthUtil (4696): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Неизвестный источник)

Любое решение этой проблемы? Любая помощь будет оценена.

4b9b3361

Ответ 1

Попробуйте с помощью 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";

Они представляют собой разрешения, которые ваше приложение запрашивает у пользователя. Области, запрошенные в этом примере, описаны здесь:

Ответ 2

Используйте отдельный поток для вашего интернет-кода. Ошибка говорит о том, что более длительный процесс работает в приложении, а здесь - в Интернете. Поэтому используйте отдельный поток или задачу Async.

Посмотрите эту ссылку NetworkOnMainThreadException

Надеюсь, это поможет вам.

Ответ 3

E/GoogleAuthUtil (4696): java.lang.IllegalStateException: вызов этого от вашего основного потока может привести к тупиковой ситуации

Похоже, вам нужно сделать это в отдельном потоке, попробовали ли вы это?

Здесь вы можете найти информацию о потоках в Android.

Ответ 4

            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();