web-dev-qa-db-ja.com

Castアプリケーションの「GoogleApiClientはまだ接続されていません」例外

コンテンツをChromecastにキャストするAndroidアプリケーションを開発しています。場合によってはcom.google.Android.gms.common.api.GoogleApiClient.ConnectionCallbacksonConnectedメソッドの実装で、

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

例外。

スタックトレースは次のとおりです。

    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)

これは、以前にGoogleApiClientに接続したことがあり、2回目に接続した場合にのみ発生するようです。 2つの呼び出しの間で、以下のコードを使用してAPIクライアントから切断します。

私の推測では、これはバグです。私は正しいですか?私はonConnectedメソッドにいるので、GoogleApiClientはすでに接続されているはずです。

それを回避するために私は何ができますか? GoogleApiClientが実際に接続されるまでしばらく待つ必要がありますか?

私はサービスでこれを行っており、ここに関連するビットがあります:

サービスの開始時:

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

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

    }

connectionCallbackには次のコードがあります。

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

上記のコードは、クラッシュが発生する部分です。

そして、サービスを停止すると、次のコードが実行されます。

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

前もって感謝します。

12
joaomgcd

Android> GoogleApiClient 用のGoogle API

状態に関係なく、アクティビティのonCreate(Bundle)メソッドでクライアントオブジェクトをインスタンス化し、onStart()でconnect()を呼び出し、onStop()でdisconnect()を呼び出す必要があります。

GoogleApiClientの実装は、単一のインスタンスのみを対象として設計されているようです。 onCreateで1回だけインスタンス化し、単一のインスタンスを使用して接続と切断を実行するのが最善です。

実際に接続できるのは1つのGoogleApiClientだけですが、複数のインスタンスがonConnectedコールバックを受信して​​いると思います。

あなたの場合、connectonStartを呼び出さず、onRouteAddedでのみ呼び出すことはおそらく問題ありません。

この問題は に非常に似ていると思います致命的な例外:Java.lang.IllegalStateException GoogleApiClientがまだ接続されていません

7
mattm

次のように宣言します<meta>タグ

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

私は書くのを忘れたので、あなたもこの理由で立ち往生するかもしれません。

ありがとうございました。

5
Pratik Butani

ショーケースアプリから( Googlecast Github Sample CastHelloText-Android )レシーバーアプリがonRouteSelectedで起動されます(コードで実行しているため、onRouteAddedではありません)。それを変えようと思います。それが機能しない場合は、接続とセッションに関連するすべてのメソッドにログ行を追加して、何が起こっているかを確認します。

別のヒント:アプリケーションを停止するとクラッシュしました(Chromecastデバイスが電源から物理的に接続されている場合)。解決策は、Cast.CastApi.stopApplication(apiClient);内にputif (apiClient.isConnected())を置くことです。

2
Drez

接続する前にGoogleApiClientを呼び出しているようです

この行を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();
    }

お役に立てば幸いです。

0
Deepak