Периодический сбой аутентифицированной облачной конечной точки в клиенте Android
У меня есть приложение в производстве, которое получает значительное количество принудительных / закрытий при вызове аутентифицированной конечной точки облака. Самое выразительное сообщение " java.lang.IllegalArgumentException: служба не зарегистрирована: com.google.android.gms.internal.es@4481e6a8 ", Логика работает правильно в 95% случаев. Трассировка стека ошибки выглядит следующим образом:
java.lang.RuntimeException: произошла ошибка при выполнении doInBackground () в android.os.AsyncTask $ 3.done (AsyncTask.java:200) в java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273 at) java.util.concurrent.FutureTask.setException (FutureTask.java:124) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307) в java.util.concurrent.FutureTask.run (FutureTask.j 137) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:561) в java.lang.Threadjr : 1096) Вызывается: java.lang.IllegalArgumentException: служба не зарегистрирована: com.google.android.gms.internal.es@4481e6a8 в android.app.ActivityThread $ PackageInfo.forgetServiceDispatcher (ActivityThread.java:1074) в android.app .ContextImpl.unbindService (ContextImpl.java:886) на android.content.ContextWrapper.unbindService (ContextWrapper.java:352) на com.google.android.gms.auth.GoogleAuthUt il.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (неизвестный источник) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) в java.util.concurrent.FutureTask $ Sync.innerun (FutureTask.java:305) на com.google.android.gms.auth.GoogleAuthUtil.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (неизвестный источник) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) в java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) в java.util.concurrent.FutureTask $ Sync.innerRun ( FutureTask.java:305) на java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) на com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.java.lang. Строка getToken () (SourceFile: 192) по адресу com.google.api.client.googleapis.extensions.android.gm s.auth.GoogleAccountCredential $ RequestHandler.void intercept (com.google.api.client.http.HttpRequest) (SourceFile: 217) на com.google.api.client.http.HttpRequest.com.google.api.client.http .HttpResponse execute () (SourceFile: 836) по адресу com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed (логическое значение) (SourceFile: 412) в com.google. api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed () (SourceFile: 345) по адресу com.google.api.client.googleapis.services.AbstractGoogleClientRequgg.bject () (SourceFile: 463) в com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground (com.google.api.services.marketendpoint.model.Market []) ( SourceFile: 355) на com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.java.lang.Object doInBackground (java.lang.Object []) (SourceFile: 1) на android.os.AsyncTask $ 2.call (AsyncTask.java:185) на java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) ... еще 4
Моя реализация очень соответствует образцам Google. Например, в Android я использую AsyncTask для совершения звонка следующим образом:
private class QueryMarketStats extends AsyncTask {
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market...markets) {
com.google.api.services.marketendpoint.model.Market result = null;
try {
result = service.market().latest(state.getServerID()).execute();
}
catch (SSLException e) {
PrimeDataStore();
Log.d("app", e.getMessage(), e);
}
catch (GoogleAuthIOException e) {
Log.d("app", e.getMessage(), e);
}
catch (IOException e) {
Log.d("app", e.getMessage(), e);
}
return result;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(com.google.api.services.marketendpoint.model.Market result) {
// Process result...
}
}
Строка, сообщающая об ошибке:result = service.market (). latest (state.getServerID ()). execute ();
Я проверил, что параметр для getServerID () возвращает приемлемое значение. Моя теория на данный момент заключается в том, что Сервисы Google Play не могут предоставить учетную запись, которая все еще аутентифицирована. Хотя я не смог воспроизвести, я считаю, что проблема может возникнуть, когда приложение переходит в спящий режим. Поэтому я подтвердил свою логику onResume () следующим образом:
@Override
protected void onResume() {
super.onResume();
checkPlayServices();
isInFront = true;
}
Что еще может вызвать этот прерывистый сбой? Это известная проблема?