Error intermitente del punto final de la nube autenticada en el cliente de Android
Tengo una aplicación en producción que está recibiendo un número significativo de fuerza / cierra al llamar a un punto final de nube autenticado. El mensaje más significativo es "java.lang.IllegalArgumentException: Servicio no registrado: com.google.android.gms.internal.es@4481e6a8" . La lógica funciona correctamente el 95% del tiempo. El seguimiento de la pila del fallo es el siguiente:
Java.lang.RuntimeException: Se ha producido un error al ejecutar doInBackground () en android.os.AsyncTask $ 3.done (AsyncTask.java:200) en java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273) at Java.util.concurrent.FutureTask.setException (FutureTask.java:124) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307) en java.util.concurrent.FutureTask.run (FutureTask.java: 137) en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068) en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:561) en java.lang.Thread.run (Thread.java : 1096) Causado por: java.lang.IllegalArgumentException: Servicio no registrado: com.google.android.gms.internal.es@4481e6a8 en android.app.ActivityThread $ PackageInfo.forgetServiceDispatcher (ActivityThread.java:1074) en android.app .ContextImpl.unbindService (ContextImpl.java:886) en android.content.ContextWrapper.unbindService (ContextWrapper.java:352) en com.google.android.gms.auth.GoogleAuthUt Il.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (fuente desconocida) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) En java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) en com.google.android.gms.auth.GoogleAuthUtil.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (fuente desconocida) en Java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) en java.util.concurrent.FutureTask $ Sync.innerRun FutureTask.java:305) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) en com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.java.lang. String getToken () (SourceFile: 192) en com.google.api.client.googleapis.extensions.android.gm S.auth.GoogleAccountCredential $ RequestHandler.void intercept (com.google.api.client.http.HttpRequest) (SourceFile: 217) en com.google.api.client.http.HttpRequest.com.google.api.client.http .HttpResponse execute () (SourceFile: 836) en com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed (booleano) (SourceFile: 412) en com.google. Api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed () (SourceFile: 345) en com.google.api.client.googleapis.services.AbstractGoogleClientRequest.java.lang.Object ejecutar () (SourceFile: 463) en com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground (com.google.api.services.marketendpoint.model.Market []) ( SourceFile: 355) en com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.java.lang.Object doInBackground (java.lang.Object []) (SourceFile: 1) en android.os.AsyncTask $ 2.call (AsyncTask.java:185) en java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) … más
- Implementación de servicios de Google Play en android
- GooglePlayServicesUtil.isGooglePlayServicesAvailable () se bloquea
- Android Fused Location API - cómo utilizar PRIORITY_BALANCED_POWER_ACCURACY y PRIORITY_HIGH_ACCURACY en una aplicación?
- No se puede obtener el proveedor com.google.android.gms.measurement.AppMeasurementContentProvider
- ¿Hay ventajas de usar FusedLocationProviderApi sobre LocationManager?
Mi implementación es muy consistente con las muestras de Google. Por ejemplo, mi actividad de Android utiliza un AsyncTask para realizar la llamada, de la siguiente manera:
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... } }
La línea que da el error es: result = service.market (). Latest (state.getServerID ()). Execute ();
He verificado el parámetro para getServerID () está devolviendo un valor que es aceptable. Mi teoría en este momento es que Google Play Services no puede proporcionar una cuenta que todavía esté autenticada. Aunque he sido incapaz de reproducir, creo que el problema puede ocurrir cuando la aplicación se duerme. Por lo tanto, confirmé mi onResume () lógica, como sigue:
@Override protected void onResume() { super.onResume(); checkPlayServices(); isInFront = true; }
¿Qué más podría causar este fallo intermitente? ¿Se trata de un problema conocido?
- Problema con Robolectric con la nueva versión de los servicios de Google Play
- Configuración de Google Play Games Services
- Android NullPointerException en $ Proxy0.equals
- PRIORITY_LOW_POWER vs PRIORITY_BALANCED_POWER_ACCURACY para el servicio de Google Play v2
- Caché de dispositivos múltiples de Google IAB V3
- Separar las preocupaciones de la actividad y GoogleApiClient
- Authorize Android Game - ¿Dónde está la app-id?
- Si Google Play Store está oculto, Google Play Service no está disponible también.
En lugar de una alternativa mejor, estoy captando la excepción y desencadenar una reintento con éxito. Cualquiera que sea el problema intermitente que está causando que el servicio no se registre en el momento en que se llama al punto final, las invocaciones futuras del servicio funcionan correctamente.
Código de Trabajo
@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(e); } catch (GoogleAuthIOException e) { Log(e); } catch (IOException e) { Log(e); } catch (IllegalArgumentException e) { // This caused a lot of intermittent force/closes. Log(e); } return result; } @Override protected void onPostExecute(com.google.api.services.marketendpoint.model.Market result) { DismissProgressDialogIfPresent(); com.google.api.services.marketendpoint.model.Market m = (com.google.api.services.marketendpoint.model.Market) result; if( m == null) { // Verify the current activity is active if( isInFront ) { // Present a retry/cancel dialog AlertDialog.Builder builder = new AlertDialog.Builder(EmpireTrackerActivity.this); builder.setMessage("An error was encountered retrieving the latest market data.\n\nPlease verify you are connected to the Internet."); builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); m_ProgressDlg = ProgressDialog.show(EmpireTrackerActivity.this, "Please wait...", "Retrieving data ...", true); new QueryMarketStats().execute(); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); } return; } // Process newly posted data state.setMarketObj(m); state.setIsInitialized(true); state.WriteFile(EmpireTrackerActivity.this); super.onPostExecute(result); }
}
- Publicar en pared FB Utilizar SDK 3.0
- Error al intentar utilizar "cordova build" en un proyecto de Android con referencias de subproyectos