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

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?

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); } 

}

  • ¿Qué es la versión mínima de Google Play Services para utilizar Firebase?
  • Obtenga la ubicación (coordenadas) periódicamente sin aumentar drásticamente el consumo de la batería
  • ¿Cómo reinicio las tablas de clasificación de Google Play Games antes de publicarlas?
  • ¿Cómo puedo hacer que los servicios de Play Game no se inicien automáticamente al inicio?
  • SDK de Google Plus para Android: "Actividad iniciada sin un EXTRA_ACCOUNT"
  • Mi aplicación es compatible en 2.3.3, cómo hacerlo compatible
  • No se puede cancelar el botón de inicio de sesión de Google+
  • Los servicios de Google Play están desactualizados. Requiere 3159100 pero encontrado 3158130
  • Mostrar el selector de cuenta cada vez con GoogleSignInApi
  • Com.android.build.transform.api.TransformException con los servicios de google play de android
  • Mi botón de Google + 1 está atenuado y no funciona?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.