Пример приложения Google Cast SDK3 для Android не работает на устройстве ниже 5.0

Я попробовал пример приложения Google Cast для Android, и он рушится для устройств ниже 5.0. У кого-нибудь есть идеи, почему? ниже мой аварийный журнал:

0830 12:38:57.242: E/AndroidRuntime(16269): вызвано: java.lang.RuntimeException: com.google.android.gms.internal.zzsb$zza: приемлемый модуль не найден. Локальная версия - 0, а удаленная - 0. 0830 12:38:57.242: E/AndroidRuntime(16269): на com.google.android.gms.internal.zzni.zzbg(неизвестный источник) 0830 12:38:57.242: E/AndroidRuntime(16269): на com.google.android.gms.internal.zzni.zza(неизвестный источник) 0830 12:38:57.242: E/AndroidRuntime(16269): на com.google.android.gms.cast.framework.CastContext. 没有加一

1 ответ

Решение

В последнем Cast SDK произошли изменения, которые сделали его несовместимым (аварийно завершающим работу) со старыми версиями Сервисов Google Play. К сожалению, даже приложение Cast с образцом зависает при использовании последней версии Cast SDK с устаревшим GPS (или на эмуляторах). Эта проблема обсуждалась здесь: https://github.com/googlecast/CastVideos-android/issues/12

Решение состоит в том, чтобы проверить версию Служб Google Play перед инициализацией любых компонентов приведения, включая мини-контроллер (то есть вы не можете просто вставить фрагмент мини-контроллера в свой файл макета xml - вы должны либо динамически его накачать, либо иметь два файла макета - один с, и один без вашего мини-контроллера).

Код для проверки версии GPS:

GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
int resultCode = apiAvailability.isGooglePlayServicesAvailable(context);
isGPSAvailable = (resultCode == ConnectionResult.SUCCESS);

Если результатов нет ConnectionResult.SUCCESS не инициализируйте MiniControllerFragment и не получить доступ CastContext,

Также имейте в виду, что создание экземпляра невозможно MiniControllerFragment с помощью new MiniControllerFragment(), Вы должны надуть его из XML или вы получите NullPointerException,

Есть два способа надуть MiniControllerFragment:

  1. Создайте отдельные файлы макета XML и накачайте соответствующий файл в своем Activity.onCreate:

    setContentView(isGPSAvailable ? R.layout.activity_main_with_controller : R.layout.activity_main_without_controller);
    
  2. Создайте ViewStub в вашем макете, указывая на MiniControllerFragment и раздувать его только тогда, когда у вас есть игровые сервисы.

макет деятельности:

<ViewStub
android:id="@+id/cast_minicontroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/cast_mini_controller_fragment"
/>

cast_mini_controller_fragment:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/castMiniController"
          class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:visibility="gone"/>

код в вашей деятельности onCreate():

ViewStub miniControllerStub = (ViewStub) findViewById(R.id.cast_minicontroller);
if (isGPSAvailable) {
    miniControllerStub.inflate();
}

Я предпочитаю ViewStub подход, так как он не дублирует ваши макеты.

Другие вопросы по тегам