В моем приложении Android я пытаюсь получить AccessToken из GoogleAuthUtil, как показано ниже:
AccessToken = GoogleAuthUtil.getToken (это, mPlusClient.getAccountName (), "oauth2:" + SCOPES);
Но в этой строке я получаю ошибку, как показано ниже:
E / GoogleAuthUtil (4696): вызов этого из основного потока может привести к взаимоблокировке и / или ANRs E / GoogleAuthUtil (4696): java.lang.IllegalStateException: вызов этого из основного потока может привести к тупиковой ситуации E / GoogleAuthUtil (4696) : At com.google.android.gms.auth.GoogleAuthUtil.b (Неизвестный источник) E / GoogleAuthUtil (4696): at com.google.android.gms.auth.GoogleAuthUtil.getToken (Неизвестный источник) E / GoogleAuthUtil (4696) : At com.google.android.gms.auth.GoogleAuthUtil.getToken (Неизвестный источник)
Любое решение этой проблемы? Любая помощь будет оценена по достоинству.
Попробуйте с помощью 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";
Они представляют собой разрешения, которые ваше приложение запрашивает у пользователя. Области, запрошенные в этом примере, описаны здесь:
Используйте отдельный поток для вашего интернет-кода. Ошибка говорит о том, что в приложении работает больше времени, и это интернет. Поэтому используйте отдельный поток или задачу Async.
Проверьте эту ссылку NetworkOnMainThreadException
Надеюсь, это поможет вам.
E / GoogleAuthUtil (4696): java.lang.IllegalStateException: вызов этого из основного потока может привести к взаимоблокировке
Похоже, вам нужно сделать это в отдельном потоке, вы пробовали это?
Здесь вы можете найти информацию о потоках в Android.
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();