Следующая процедура позволяет преобразовать ваше приложение-отправитель для Android с Cast SDK v2 на CAF Sender, основанный на синглтоне CastContext .
SDK отправителя Cast CAF использует CastContext для управления GoogleAPIClient от вашего имени. CastContext управляет жизненным циклом, ошибками и обратными вызовами, что значительно упрощает разработку приложения Cast.
Введение
- CAF Sender по-прежнему распространяется как часть сервисов Google Play с использованием менеджера SDK Android.
- Добавлены новые пакеты, которые берут на себя ответственность за соответствие контрольному списку Google Cast Design (
com.google.android.gms.cast.framework.*). - CAF Sender предоставляет виджеты, соответствующие требованиям Cast UX; в версии 2 никаких компонентов пользовательского интерфейса не было, и требовалось реализовать эти виджеты самостоятельно.
- Использование GoogleApiClient больше не требуется для работы с Cast API.
- Функция субтитров в CAF Sender аналогична версии 2.
Зависимости
V2 и CAF имеют те же зависимости от библиотек поддержки и сервисов Google Play (версия 9.2.0 или более поздняя), что и описано в Руководстве по функциям библиотек поддержки.
Минимальная версия Android SDK, поддерживаемая CAF, — 9 (Gingerbread).
Инициализация
В CAF для фреймворка Cast требуется явный этап инициализации. Он включает инициализацию синглтона CastContext с использованием соответствующего OptionsProvider для указания идентификатора приложения Web Receiver и любых других глобальных параметров.
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return null;
}
}
Объявите OptionsProvider внутри тега "application" в файле AndroidManifest.xml приложения:
<application>
...
<meta-data
android:name=
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>
В методе onCreate каждого Activity следует отложенно инициализировать CastContext :
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
В версии 2 эти шаги не требовались.
обнаружение устройств
В CAF процесс обнаружения запускается и останавливается автоматически фреймворком, когда приложение переходит в активный режим и в фоновый режим соответственно. Использовать MediaRouteSelector и MediaRouter.Callback не следует.
Кнопка трансляции и диалоговое окно трансляции
Как и в версии 2, эти компоненты предоставляются библиотекой поддержки MediaRouter .
Кнопка Cast по-прежнему реализуется компонентом MediaRouteButton и может быть добавлена в ваше действие (с помощью ActionBar или Toolbar ) в качестве пункта меню.
<item
android:id="@+id/media_route_menu_item"
android:title="@string/media_route_menu_title"
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
app:showAsAction="always"/>
Переопределите метод onCreateOptionMenu() каждого Activity, используя CastButtonFactory для связи MediaRouteButton с фреймворком Cast:
private MenuItem mediaRouteMenuItem;
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
mediaRouteMenuItem =
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
При нажатии на кнопку автоматически отображается диалоговое окно Cast.
Управление устройством
В CAF управление устройством в значительной степени осуществляется фреймворком. Приложению-отправителю не нужно (и не следует пытаться) обрабатывать подключение к устройству и запуск приложения Web Receiver с помощью GoogleApiClient . Взаимодействие между отправителем и Web Receiver теперь представлено как «сессия». Класс SessionManager обрабатывает жизненный цикл сессии и автоматически запускает и останавливает сессии в ответ на действия пользователя: сессия запускается, когда пользователь выбирает устройство Cast в диалоговом окне Cast, и завершается, когда пользователь нажимает кнопку «Остановить трансляцию» в диалоговом окне Cast или когда само приложение-отправитель завершает работу. Приложение-отправитель может получать уведомления о событиях жизненного цикла сессии, зарегистрировав SessionManagerListener в SessionManager . Колбэки SessionManagerListener определяют методы обратного вызова для всех событий жизненного цикла сессии.
Класс CastSession представляет собой сессию с устройством Cast. Класс содержит методы для управления громкостью устройства и состоянием отключения звука, что ранее в версии 2 было реализовано с помощью методов класса Cast.CastApi .
В версии 2 функции обратного вызова Cast.Listener предоставляли уведомления об изменениях состояния устройства, включая громкость, состояние отключения звука, статус ожидания и так далее.
В CAF уведомления об изменении состояния громкости/отключения звука по-прежнему передаются через методы обратного вызова в Cast.Listener ; эти слушатели регистрируются в CastSession . Все остальные уведомления о состоянии устройства передаются через методы обратного вызова CastStateListener ; эти слушатели также регистрируются в CastSession . Убедитесь, что вы по-прежнему отменяете регистрацию слушателей, когда связанные фрагменты, действия или приложения переходят в фоновый режим.
Логика переподключения
Как и в версии 2, CAF пытается восстановить сетевые соединения, потерянные из-за временной потери сигнала Wi-Fi или других сетевых ошибок. Теперь это делается на уровне сессии; сессия может перейти в состояние «приостановлено» при потере соединения и вернется в состояние «подключено» при восстановлении связи. В рамках этого процесса фреймворк отвечает за повторное подключение к приложению Web Receiver и повторное подключение любых каналов Cast.
Кроме того, CAF также добавляет автоматическое возобновление сессии, которое включено по умолчанию (и может быть отключено через CastOptions ). Если приложение-отправитель переходит в фоновый режим или завершается (например, при свайпе или сбое) во время выполнения сессии Cast, платформа попытается возобновить эту сессию, когда приложение-отправитель вернется на передний план или будет перезапущено; это обрабатывается автоматически SessionManager , который будет отправлять соответствующие обратные вызовы для всех зарегистрированных экземпляров SessionManagerListener .
Регистрация пользовательского канала
В версии 2 пользовательские каналы (реализованные с помощью Cast.MessageReceivedCallback ) регистрируются в Cast.CastApi . В CAF пользовательские каналы вместо этого регистрируются в экземпляре CastSession . Регистрация может быть выполнена в методе обратного вызова SessionManagerListener.onSessionStarted . Для медиаприложений больше не требуется явно регистрировать канал управления медиафайлами через Cast.CastApi.setMessageReceivedCallbacks ; подробности см. в следующем разделе.
Управление медиафайлами
Класс v2 RemoteMediaPlayer устарел и не должен использоваться. В CAF он заменен новым классом RemoteMediaClient , который предоставляет эквивалентную функциональность в более удобном API. Нет необходимости явно инициализировать или регистрировать этот объект; фреймворк автоматически создаст экземпляр объекта и зарегистрирует базовый медиаканал при запуске сессии, если подключаемое приложение Web Receiver поддерживает пространство имен media.
Доступ RemoteMediaClient можно получить через метод getRemoteMediaClient объекта CastSession .
В версии 2 все запросы к медиафайлам, отправляемые через RemoteMediaPlayer , возвращали бы объект RemoteMediaPlayer.MediaChannelResult через функцию обратного вызова PendingResult .
В CAF все медиа-запросы, отправляемые через RemoteMediaClient возвращают объект RemoteMediaClient.MediaChannelResult через функцию обратного вызова PendingResult , которую можно использовать для отслеживания хода выполнения и конечного результата запроса.
Версия 2 RemoteMediaPlayer будет отправлять уведомления об изменениях состояния медиаплеера в веб-приемнике через RemoteMediaPlayer.OnStatusUpdatedListener .
В CAF RemoteMediaClient предоставляет эквивалентные обратные вызовы через свой интерфейс RemoteMediaClient.Listener . К RemoteMediaClient можно зарегистрировать любое количество слушателей, что позволяет нескольким компонентам-отправителям совместно использовать единственный экземпляр RemoteMediaClient , связанный с сессией.
В версии 2 приложение-отправитель должно было взять на себя задачу синхронизации пользовательского интерфейса с состоянием медиаплеера на веб-приемнике.
В CAF большую часть этих обязанностей берет на себя класс UIMediaController .
Вводное наложение
В версии V2 отсутствует вводный интерфейс.
CAF предоставляет настраиваемое представление IntroductoryOverlay , которое выделяет кнопку Cast при первом показе пользователям.
Мини-контроллер
В версии 2 вам потребуется с нуля реализовать мини-контроллер в приложении отправителя.
В CAF SDK предоставляет настраиваемое представление MiniControllerFragment , которое можно добавить в файл разметки приложения для тех активностей, где вы хотите отобразить мини-контроллер.
Уведомления и экран блокировки
В версии 2 контроллеры для уведомлений и экрана блокировки не предоставляются SDK. Для этого SDK вам необходимо интегрировать эти функции в ваше приложение-отправитель, используя API фреймворка Android.
В CAF SDK предоставляет NotificationsOptions.Builder , который помогает создавать элементы управления мультимедиа для уведомлений и экрана блокировки в приложении отправителя. Элементы управления уведомлениями и экраном блокировки можно включить с помощью CastOptions при инициализации CastContext .
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setTargetActivityClassName(VideoBrowserActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.setCastMediaOptions(mediaOptions)
.build();
}
Расширенный контроллер
В версии 2 вам потребуется с нуля реализовать расширенный контроллер в приложении отправителя.
CAF предоставляет вспомогательный класс UIMediaController , который упрощает создание собственного расширенного контроллера.
CAF добавляет готовый виджет расширенного контроллера ExpandedControllerActivity , который вы можете просто добавить в свое приложение. Вам больше не нужно реализовывать собственный расширенный контроллер с помощью UIMediaController .
Аудиофокус
В версии 2 для управления фокусом звука необходимо использовать MediaSessionCompat .
В системе CAF фокусировка звука управляется автоматически.
Ведение отладочной документации
В CAF отсутствуют опции ведения журналов.
Примеры приложений
У нас есть обучающие материалы и примеры приложений , использующих CAF, на Codelab .