Cast应用程序中的"GoogleApiClient尚未连接"异常

joa*_*gcd 12 android google-cast chromecast

我正在开发一个将内容投射到Chromecast的Android应用程序.有时在我com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacksonConnected方法实现中,我得到了一个

java.lang.IllegalStateException: GoogleApiClient is not connected yet.
Run Code Online (Sandbox Code Playgroud)

例外.

这是堆栈跟踪:

    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)
Run Code Online (Sandbox Code Playgroud)

如果我之前已经连接到GoogleApiClient并且第二次连接,这似乎只会发生.在2次调用之间,我使用下面的代码断开与api客户端的连接.

我的猜测是这是一个错误.我对么?由于我在这个onConnected方法中,GoogleApiClient应该已经连接了.

我该怎么做才能绕过它?我应该等待一段时间才能真正连接GoogleApiClient吗?

我在服务中这样做,以下是相关的部分:

服务开始时:

mMediaRouter.addCallback(mMediaRouteSelector, mediaCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
Run Code Online (Sandbox Code Playgroud)

mediaCallback有这个代码:

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

    }
Run Code Online (Sandbox Code Playgroud)

connectionCallback有这段代码:

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

上面的代码是发生崩溃的部分.

当我停止服务时,我运行此代码:

if (mMediaRouter != null) {
    mMediaRouter.removeCallback(mediaCallback);
    mMediaRouter = null;
}
if (apiClient != null) {
    Cast.CastApi.stopApplication(apiClient);
    if (apiClient.isConnected()) {
        apiClient.disconnect();
        apiClient = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

mat*_*ttm 7

适用于Android的Google API> GoogleApiClient

您应该在Activity的onCreate(Bundle)方法中实例化一个客户端对象,然后在onStart()中调用connect(),在onStop()中调用disconnect(),而不管状态如何.

该实现GoogleApiClient仅针对单个实例设计.最好只将其实例化一次onCreate,然后使用单个实例执行连接和断开连接.

我猜想只有一个GoogleApiClient可以实际连接,但多个实例正在接收onConnected回调.

在你的情况下,它可能是罚款不叫connectonStart,但只有在onRouteAdded.

我认为这个问题与致命异常非常相似 :java.lang.IllegalStateException GoogleApiClient尚未连接


Pra*_*ani 5

您是否声明了以下<meta>标签

<application ...> 
... 
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
... 
</application>
Run Code Online (Sandbox Code Playgroud)

我只是忘了写,所以你也可能坚持这个理由.

谢谢.


Dre*_*rez 2

从展示应用程序(Googlecast Github Sample CastHelloText-android)接收器应用程序在RouteSelected上启动(而不是像您在代码中所做的那样在RouteAdded上启动)。我会尝试改变这一点。如果它不起作用,我会在与连接和会话相关的每个方法中添加日志行,并查看发生了什么。

另一个提示:我在停止应用程序时发生了崩溃(如果 chromecast 设备被物理拔掉电源)。解决办法就是放到Cast.CastApi.stopApplication(apiClient);里面if (apiClient.isConnected())