"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.
- Cómo capturar clics de UIMediaController a través de la interfaz de control de conversión
- ¿Cuál es la forma correcta de interactuar con Chromecast desde una notificación de Android?
- Publicar imagen (foto) en Chromecast
- ¿Dónde puedo encontrar android.support.v7.mediarouter.R $ attr?
- Chrome (Android) - Casting de vídeos HTML5 autenticados
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.
- Chromecast con múltiples actividades
- Al intentar encontrar un Chromecast - MediaRouter.Callback nunca se llama a mi aplicación para algunos de mis usuarios
- No se puede depurar el dispositivo de lista blanca / ApplicationSession al no iniciar
- No se puede enviar a la aplicación personal de lista blanca
- RemotePlaybackClient, stop () no recibe devolución de llamada
- ¿Cómo puedo mantener viva una ruta de ChromeCast cuando mi aplicación está en segundo plano con la batería?
- ¿Hay alguna solución para hacer que el dispositivo android funcione como un Receptor fundido?
- Google-cast v3 espacio de nombres personalizado
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.
- Utilizar un SVG como fondo dibujable en Android
- IsProviderEnabled (LocationManager.NETWORK_PROVIDER) devuelve false