Подтвердить что ты не робот

"GoogleApiClient еще не подключен" исключение в приложении Cast

Я разрабатываю приложение для Android, которое передает контент в Chromecast. Иногда в моей реализации com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks в методе onConnected я получаю

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 и снова подключился. Между двумя вызовами я отсоединяюсь от клиента 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;
    }
}

Спасибо заранее.

4b9b3361

Ответ 1

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

Вы должны создать экземпляр объекта клиента в методе Activity onCreate (Bundle), а затем вызвать connect() в onStart() и отключить() в onStop() независимо от состояния.

Реализация GoogleApiClient появляется только для одного экземпляра. Лучше всего создать экземпляр только один раз в onCreate, а затем выполнить соединения и отключения, используя один экземпляр.

Я бы предположил, что на самом деле можно подключить только один GoogleApiClient, но несколько экземпляров получают обратный вызов onConnected.

В вашем случае, вероятно, прекрасно не называть connect в onStart, а только в onRouteAdded.

Я думаю, что эта проблема очень похожа на Fatal Exception: java.lang.IllegalStateException GoogleApiClient еще не подключен

Ответ 2

Вы объявляете следующий тег <meta>

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

Я просто забыл написать, так что вы тоже можете придерживаться этой причины.

Спасибо.

Ответ 3

Из приложения showcase (https://github.com/googlecast/CastHelloText-android) приложение-приемник запускается onRouteSelected (а не onRouteAdded, как вы это делаете в своем коде). Я попытаюсь изменить это. Если он не работает, я бы добавил строки журнала в каждый метод, связанный с подключением и сеансом, и посмотрел, что происходит.

Еще один совет: у меня был сбой при остановке приложения (в случае, если устройство хромирования физически отключено от питания). Решение состоит в том, чтобы положить Cast.CastApi.stopApplication(apiClient); внутрь if (apiClient.isConnected()).

Ответ 4

Кажется, что вы вызываете 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();
    }

Надеюсь, это поможет вам.