L'exception "GoogleApiClient n'est pas encore connectée" dans l'application Cast
Je voudrais développer une application Android qui jette le contenu de Chromecast.
Parfois, dans mon com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks
mise en œuvre dans le onConnected
méthode, j'obtiens un
java.lang.IllegalStateException: GoogleApiClient is not connected yet.
exception.
Ici est la trace de la pile:
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$h.b(Unknown Source)
at com.google.android.gms.internal.dw$h.b(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)
Cela ne semble se produire si j'avais déjà connecté à la GoogleApiClient avant et je suis de la connexion pour une deuxième fois. Entre les 2 appels à me déconnecter de l'api client avec le code ci-dessous.
Ma conjecture est que c'est un bug. Suis-je la corriger? Depuis que je suis dans le onConnected
méthode, la GoogleApiClient doit déjà être connecté.
Que puis-je faire pour contourner cela? Devrais-je attendre un certain temps jusqu'à ce que le GoogleApiClient est vraiment connecté?
Je fais cela dans un service et voici les bits:
lorsque le service démarre:
mMediaRouter.addCallback(mMediaRouteSelector, mediaCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
mediaCallback a ce code:
@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 a ce code:
@Override
public void onConnected(final Bundle arg0) {
...
Cast.CastApi.launchApplication(apiClient, UtilAutoCast.CHROMECAST_APP_ID, false).setResultCallback(connectionCallback);
...
}
Le code ci-dessus est la partie où l'incident se produit.
Et quand j'ai arrêter le service j'exécute ce code:
if (mMediaRouter != null) {
mMediaRouter.removeCallback(mediaCallback);
mMediaRouter = null;
}
if (apiClient != null) {
Cast.CastApi.stopApplication(apiClient);
if (apiClient.isConnected()) {
apiClient.disconnect();
apiClient = null;
}
}
Merci d'avance.
source d'informationauteur joaomgcd
Vous devez vous connecter pour publier un commentaire.
Google Api pour Android > GoogleApiClient
La mise en œuvre de la
GoogleApiClient
semble avoir été conçu pour une seule instance. Il est préférable de les instancier qu'une seule fois dansonCreate
puis effectuer les connexions et déconnexions à l'aide de la seule instance.Je suppose que d'une seule
GoogleApiClient
peut être connecté, mais plusieurs instances de la réception de laonConnected
de rappel.Dans votre cas, c'est probablement pas un problème de ne pas appeler
connect
dansonStart
mais seulement dansonRouteAdded
.Je pense que ce problème est très similaire à Fatal Exception: java.lang.IllegalStateException GoogleApiClient n'est pas encore connecté
Avez-vous déclarer suivantes
<meta>
tagJ'ai juste oublié d'écrire de sorte que vous pouvez peut aussi coincé avec cette raison.
Merci.
De vitrine application (Googlecast Github Échantillon CastHelloText-android ) récepteur application est lancée onRouteSelected (pas onRouteAdded comme vous le faites dans votre code). Je voudrais essayer de changer cela. Dans le cas où il ne fonctionne pas, je voudrais ajouter les lignes du journal dans chaque méthode relatifs à la connexion & session, et de voir ce qui se passe.
Une autre astuce: j'ai eu un crash avec l'arrêt de l'application (dans le cas chromecast appareil est physiquement branché, de pouvoir). La Solution est de mettre
Cast.CastApi.stopApplication(apiClient);
à l'intérieur deif (apiClient.isConnected())
.Il semble que vous appelez GoogleApiClient avant il est connecté
déplacer cette ligne dans onCreate()
Espère que cela vous aide.