"GoogleApiClient no está conectado todavía" excepción en la aplicación Cast

Estoy desarrollando una aplicación de Android que envía contenido a Chromecast. A veces, en mi implementación de com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks en el método onConnected , obtengo una

 java.lang.IllegalStateException: GoogleApiClient is not connected yet. 

excepción.

Aquí está el rastreo de la pila:

  FATAL EXCEPTION: main Process: com.joaomgcd.autocast, PID: 13771 java.lang.IllegalStateException: GoogleApiClient is not connected yet. at com.google.android.gms.internal.eg.a(Unknown Source) at com.google.android.gms.common.api.GoogleApiClient.b(Unknown Source) at com.google.android.gms.cast.Cast$CastApi$a.launchApplication(Unknown Source) at com.joaomgcd.autocast.media.MediaConnectionCallbacks.onConnected(MediaConnectionCallbacks.java:37) at com.google.android.gms.internal.dx.b(Unknown Source) at com.google.android.gms.common.api.GoogleApiClient.bn(Unknown Source) at com.google.android.gms.common.api.GoogleApiClient.f(Unknown Source) at com.google.android.gms.common.api.GoogleApiClient$2.onConnected(Unknown Source) at com.google.android.gms.internal.dx.b(Unknown Source) at com.google.android.gms.internal.dx.bT(Unknown Source) at com.google.android.gms.internal.dw$hb(Unknown Source) at com.google.android.gms.internal.dw$hb(Unknown Source) at com.google.android.gms.internal.dw$b.bR(Unknown Source) at com.google.android.gms.internal.dw$a.handleMessage(Unknown Source) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) 

Esto sólo parece suceder si ya me había conectado a GoogleApiClient antes y me estoy conectando por segunda vez. Entre las 2 llamadas me desconecto del cliente api con el código de abajo.

Mi conjetura es que esto es un error. ¿Estoy en lo correcto? Ya que estoy en el método onConnected , el GoogleApiClient ya debería estar conectado.

¿Qué puedo hacer para evitarlo? ¿Debo esperar un momento hasta que el GoogleApiClient esté realmente conectado?

Estoy haciendo esto en un servicio y aquí están los bits pertinentes:

Cuando se inicia el servicio:

 mMediaRouter.addCallback(mMediaRouteSelector, mediaCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); 

MediaCallback tiene este código:

 @Override public void onRouteAdded(MediaRouter router, RouteInfo route) { super.onRouteAdded(router, route); if (route.getDescription().equals("Chromecast")) { ... mSelectedDevice = com.google.android.gms.cast.CastDevice.getFromBundle(route.getExtras()); ... castClientListener = new CastListener(context, apiClient); Cast.CastOptions.Builder apiOptionsBuilder = Cast.CastOptions.builder(mSelectedDevice, castClientListener); ... apiClient.set(new GoogleApiClient.Builder(context).addApi(Cast.API, apiOptionsBuilder.build()).addConnectionCallbacks(connectionCallback).addOnConnectionFailedListener(new MediaConnectionFailedListener(context)).build()); apiClient.get().connect(); } } 

ConnectionCallback tiene este código:

 @Override public void onConnected(final Bundle arg0) { ... Cast.CastApi.launchApplication(apiClient, UtilAutoCast.CHROMECAST_APP_ID, false).setResultCallback(connectionCallback); ... } 

El código anterior es la parte donde ocurre el accidente.

Y cuando paro el servicio ejecuto este código:

 if (mMediaRouter != null) { mMediaRouter.removeCallback(mediaCallback); mMediaRouter = null; } if (apiClient != null) { Cast.CastApi.stopApplication(apiClient); if (apiClient.isConnected()) { apiClient.disconnect(); apiClient = null; } } 

Gracias por adelantado.

https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

Debe instanciar un objeto de cliente en el método onCreate (Bundle) de su actividad y luego llamar a connect () en onStart () y desconectar () en onStop (), independientemente del estado.

La implementación de GoogleApiClient aparece diseñada para una única instancia. Lo mejor es instanciarlo sólo una vez en onCreate , luego realizar conexiones y desconexiones usando la instancia única.

Supongo que sólo un GoogleApiClient puede ser realmente conectado, pero varias instancias están recibiendo la onConnected llamada onConnected .

En su caso, probablemente es bueno no llamar a connect en onStart , pero sólo en onRouteAdded .

Creo que este problema es muy similar a Excepción fatal: java.lang.IllegalStateException GoogleApiClient aún no está conectado

¿Ha declarado la siguiente etiqueta <meta>

 <application ...> ... <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> ... </application> 

Me olvidé de escribir así que también puede quedarse con esta razón.

Gracias.

Desde la aplicación showcase ( https://github.com/googlecast/CastHelloText-android ) la aplicación del receptor se inicia onRouteSelected (no onRouteAdded como lo está haciendo en su código). Intentaría cambiar eso. En caso de que no funcione, añadiría líneas de registro en cada método relacionado con la conexión y la sesión, y veré lo que está sucediendo.

Otro consejo: he tenido bloqueo con detener la aplicación (en caso de chromecast dispositivo está físicamente conectado desde el poder). La solución es poner Cast.CastApi.stopApplication(apiClient); Dentro if (apiClient.isConnected()) .

Parece que estás llamando a GoogleApiClient antes de que esté conectado

Mover esta línea en onCreate ()

 // First we need to check availability of play services if (checkPlayServices()) { // Building the GoogleApi client //buildGoogleApiClient(); try { mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build(); mGoogleApiClient.connect(); }catch (IllegalStateException e) { Log.e("IllegalStateException", e.toString()); } createLocationRequest(); } 

Espero que te ayude.

  • Ejemplos con CastCompanionLibrary para mostrar simplemente una imagen
  • La aplicación de remitente de Chromecast no detecta la desconexión / reconexión
  • No se puede obtener MPEG-DASH trabajando utilizando cast-android-sample
  • ¿Cómo emitir una página web móvil en Android?
  • Android Cast v3: no se puede encontrar ningún dispositivo
  • Notificación personalizada con Google Cast SDK v3
  • Abrir el video de YouTube de Chromecast desde mi aplicación para Android
  • No se pudo resolver: com.google.android.gms: play-services-cast: 9.8.00
  • Visualización del MediaRouteButton para Chromecast en la barra de acción
  • ¿Cómo cambio el estilo del MediaRouteButton en la barra de acción?
  • No se puede importar la biblioteca de soporte de android en eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.