私の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(Unknown Source)E/GoogleAuthUtil(4696)で:com.google.Android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)E/GoogleAuthUtil(4696)で:com.google.Android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)にあります
この問題の解決策はありますか?どんな助けでもありがたいです。
次のような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";
これらは、アプリがユーザーに要求する権限を表します。この例でリクエストされているスコープは次のとおりです。
インターネットコードには別のスレッドを使用してください。エラーは、より多くの時間のかかるプロセスがアプリ(ここではインターネット)で実行されていることを示しています。したがって、別のスレッドまたは非同期タスクを使用してください。
このリンクをチェックしてください 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();
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...*/ );
}
}
}