Следующая процедура позволит вам преобразовать ваше приложение-отправитель Android из Cast SDK v2 в CAF Sender, основанное на синглтоне CastContext .
Cast CAF Sender SDK использует CastContext для управления GoogleAPIClient от вашего имени. CastContext управляет жизненными циклами, ошибками и обратными вызовами, что значительно упрощает разработку Cast-приложения.
Введение
- CAF Sender по-прежнему распространяется как часть сервисов Google Play с использованием менеджера Android SDK.
- Добавлены новые пакеты, которые берут на себя ответственность за соответствие контрольному списку дизайна Google Cast (
com.google.android.gms.cast.framework.*
) - CAF Sender предоставляет виджеты, которые соответствуют требованиям Cast UX; версия 2 не предоставляет никаких компонентов пользовательского интерфейса и требует от вас реализации этих виджетов.
- Для использования Cast API больше не требуется использование GoogleApiClient.
- Субтитры в 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>
Лениво инициализируйте CastContext
в методе onCreate
каждого Activity:
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;
}
При нажатии кнопки автоматически открывается диалоговое окно трансляции.
Управление устройством
В 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
; более подробную информацию см. в следующем разделе.
Контроль над СМИ
Класс RemoteMediaPlayer
версии 2 устарел и не должен использоваться. В CAF он заменен новым классом RemoteMediaClient
, который предоставляет эквивалентную функциональность в более удобном API. Нет необходимости явно инициализировать или регистрировать этот объект; фреймворк автоматически создаст экземпляр объекта и зарегистрирует базовый медиаканал при начале сеанса, если подключаемое приложение Web Receiver поддерживает пространство имён media.
Доступ RemoteMediaClient
можно получить с помощью метода getRemoteMediaClient
объекта CastSession
.
В версии 2 все медиа-запросы, отправленные на RemoteMediaPlayer
, возвращали RemoteMediaPlayer.MediaChannelResult
через обратный вызов PendingResult
.
В CAF все медиа-запросы, отправленные на RemoteMediaClient
возвращают RemoteMediaClient.MediaChannelResult
через обратный вызов PendingResult
, который можно использовать для отслеживания хода выполнения и конечного результата запроса.
RemoteMediaPlayer
v2 будет отправлять уведомления об изменениях состояния медиаплеера на веб-приемнике через RemoteMediaPlayer.OnStatusUpdatedListener
.
В CAF RemoteMediaClient
предоставляет эквивалентные обратные вызовы через интерфейс RemoteMediaClient.Listener
. В RemoteMediaClient
можно зарегистрировать любое количество слушателей, что позволяет нескольким компонентам-отправителям совместно использовать один экземпляр RemoteMediaClient
, связанный с сеансом.
В версии 2 приложению-отправителю приходилось брать на себя бремя синхронизации пользовательского интерфейса с состоянием медиаплеера на веб-приемнике.
В CAF большую часть этой ответственности берет на себя класс UIMediaController
.
Вводный оверлей
V2 не предоставляет вводный наложенный пользовательский интерфейс.
CAF предоставляет настраиваемый вид IntroductoryOverlay
для подсветки кнопки Cast при ее первом показе пользователям.
Мини-контроллер
В версии 2 вам необходимо реализовать мини-контроллер с нуля в приложении-отправителе.
В CAF SDK предоставляет пользовательское представление MiniControllerFragment
, которое можно добавить в файл макета приложения для действий, в которых вы хотите отображать мини-контроллер.
Уведомления и экран блокировки
В версии 2 контроллеры для уведомлений и экрана блокировки не предусмотрены в 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.