Пример приложения 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
:
Создайте отдельные файлы макета XML и накачайте соответствующий файл в своем
Activity.onCreate
:setContentView(isGPSAvailable ? R.layout.activity_main_with_controller : R.layout.activity_main_without_controller);
Создайте
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
подход, так как он не дублирует ваши макеты.