Uwierzytelniony punkt końcowy chmury przerywany błąd klienta Android
Mam w produkcji aplikację, która otrzymuje znaczną liczbę sił / zamknięć podczas wywoływania uwierzytelnionego punktu końcowego chmury. Najbardziej wymowna wiadomość„java.lang.IllegalArgumentException: Usługa nie jest zarejestrowana: com.google.android.gms.internal.es@4481e6a8”. Logika działa poprawnie w 95% przypadków. Ślad stosu awarii jest następujący:
java.lang.RuntimeException: Wystąpił błąd podczas wykonywania doInBackground () w android.os.AsyncTask $ 3.done (AsyncTask.java:200) w java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273) w java.util.concurrent.FutureTask.setException (FutureTask.java:124) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307) w java.util.concurrent.FutureTask.run (FutureTask.java: 137) w java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068) w java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:561) w java.lang.Thread.run (Thread.java : 1096) Przyczyna: java.lang.IllegalArgumentException: Usługa nie jest zarejestrowana: com.google.android.gms.internal.es@4481e6a8 w android.app.ActivityThread $ PackageInfo.forgetServiceDispatcher (ActivityThread.java:1074) w android.app .ContextImpl.unbindService (ContextImpl.java:886) w android.content.ContextWrapper.unbindService (ContextWrapper.java:352) na com.google.android.gms.auth.GoogleAuthUt il.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (Nieznane źródło) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w com.google.android.gms.auth.GoogleAuthUtil.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (Nieznane źródło) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun ( FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) na com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.java.lang. String getToken () (SourceFile: 192) na com.google.api.client.googleapis.extensions.android.gm s.auth.GoogleAccountCredential $ RequestHandler.void intercept (com.google.api.client.http.HttpRequest) (SourceFile: 217) na com.google.api.client.http.HttpRequest.com.google.api.client.http .HttpResponse execute () (SourceFile: 836) na com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed (boolean) (SourceFile: 412) na com.google. api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed () (SourceFile: 345) w com.google.api.client.googleapis.services.AbstractGoogleClientRequest.java.lang.Object wykonaj () (SourceFile: 463) na com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground (com.google.api.services.marketendpoint.model.Market []) ( SourceFile: 355) na com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.java.lang.Object doInBackground (java.lang.Object []) (SourceFile: 1) w android.os.AsyncTask $ 2.call (AsyncTask.java:185) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) ... 4 więcej
Moja implementacja jest bardzo spójna z przykładami Google. Na przykład moja aktywność w systemie Android polega na użyciu AsyncTask do wykonania połączenia w następujący sposób:
private class QueryMarketStats extends AsyncTask<com.google.api.services.marketendpoint.model.Market, com.google.api.services.marketendpoint.model.Market, com.google.api.services.marketendpoint.model.Market> {
/* (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...
}
}
Wiersz zawierający błąd:result = service.market (). latest (state.getServerID ()). execute ();
Sprawdziłem, że parametr getServerID () zwraca wartość, która jest akceptowalna. Moim zdaniem w tym momencie usługi Google Play nie są w stanie zapewnić konta, które jest nadal uwierzytelnione. Chociaż nie mogłem się odtworzyć, uważam, że problem może wystąpić, gdy aplikacja przejdzie w stan uśpienia. Dlatego potwierdziłem moją logikę onResume () w następujący sposób:
@Override
protected void onResume() {
super.onResume();
checkPlayServices();
isInFront = true;
}
Co jeszcze może spowodować tę sporadyczną awarię? Czy to znany problem?