Перенос приложения Android Sender из Cast SDK v2 в Cast Application Framework (CAF)

Следующая процедура позволяет преобразовать приложение Android-отправителя из Cast SDK v2 в CAF Sender, основанное на синглтоне CastContext .

SDK Cast CAF Sender использует CastContext для управления GoogleAPIClient от вашего имени. CastContext управляет жизненными циклами, ошибками и обратными вызовами, что значительно упрощает разработку приложения Cast.

Введение

  • CAF Sender по-прежнему распространяется в составе сервисов Google Play с помощью менеджера Android SDK.
  • Добавлены новые пакеты, которые берут на себя ответственность за соответствие контрольному списку Google Cast Design ( 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 для указания идентификатора приложения веб-приемника и любых других глобальных параметров.

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 каждого действия:

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

Эти шаги не были необходимы в v2.

Обнаружение устройств

В CAF процесс обнаружения запускается и останавливается платформой автоматически, когда приложение переходит на передний план и переходит в фоновый режим соответственно. MediaRouteSelector и MediaRouter.Callback не следует использовать.

Кнопка трансляции и диалоговое окно трансляции

Как и в v2, эти компоненты предоставляются библиотекой поддержки 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() каждого действия, используя 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 управление устройствами в основном осуществляется платформой. Приложению-отправителю не нужно обрабатывать (и не должно пытаться это делать) подключение к устройству и запуск приложения веб-приемника с помощью GoogleApiClient . Взаимодействие между отправителем и веб-получателем теперь представлено как «сеанс». Класс SessionManager управляет жизненным циклом сеанса и автоматически запускает и останавливает сеансы в ответ на жесты пользователя: сеанс запускается, когда пользователь выбирает устройство трансляции в диалоговом окне трансляции, и завершается, когда пользователь нажимает кнопку «Остановить трансляцию» в диалоговом окне трансляции. диалоговое окно или когда само приложение-отправитель завершает работу. Приложение-отправитель может быть уведомлено о событиях жизненного цикла сеанса, зарегистрировав SessionManagerListener с помощью SessionManager . Обратные вызовы SessionManagerListener определяют методы обратного вызова для всех событий жизненного цикла сеанса.

Класс CastSession представляет сеанс с устройством Cast. В классе есть методы для управления громкостью устройства и состояниями отключения звука, что ранее было сделано в версии 2 с использованием методов Cast.CastApi .

В версии 2 обратные вызовы Cast.Listener предоставляли уведомления об изменениях состояния устройства, включая громкость, состояние отключения звука, состояние ожидания и т. д.

В CAF уведомления об изменении состояния громкости/отключения звука по-прежнему доставляются через методы обратного вызова в Cast.Listener ; эти прослушиватели зарегистрированы в CastSession . Все остальные уведомления о состоянии устройства доставляются через обратные вызовы CastStateListener ; эти прослушиватели зарегистрированы в CastSession . Убедитесь, что вы по-прежнему отменяете регистрацию прослушивателей, когда связанные фрагменты, действия или приложения переходят в фоновый режим.

Логика переподключения

Как и в версии 2, CAF пытается восстановить сетевые соединения, потерянные из-за временной потери сигнала Wi-Fi или других сетевых ошибок. Теперь это делается на уровне сеанса; сеанс может перейти в «приостановленное» состояние при потере соединения и вернуться в «подключенное» состояние при восстановлении соединения. Платформа заботится о повторном подключении к приложению веб-приемника и повторном подключении любых каналов Cast в рамках этого процесса.

Кроме того, CAF также добавляет автоматическое возобновление сеанса, которое включено по умолчанию (и может быть отключено с помощью CastOptions . Если приложение-отправитель отправляется в фоновый режим или завершается (путем смахивания или из-за сбоя) во время сеанса Cast в процессе платформа попытается возобновить этот сеанс, когда приложение-отправитель вернется на передний план или перезапустится; это автоматически обрабатывается SessionManager , который выполнит соответствующие обратные вызовы для всех зарегистрированных экземпляров SessionManagerListener .

Регистрация пользовательского канала

В версии 2 пользовательские каналы (реализованные с помощью Cast.MessageReceivedCallback ) регистрируются с помощью Cast.CastApi . В CAF пользовательские каналы вместо этого регистрируются в экземпляре CastSession . Регистрация может быть выполнена в методе обратного вызова SessionManagerListener.onSessionStarted . Для мультимедийных приложений больше нет необходимости явно регистрировать канал управления мультимедиа через Cast.CastApi.setMessageReceivedCallbacks ; более подробную информацию см. в следующем разделе.

Контроль СМИ

Класс RemoteMediaPlayer версии 2 устарел и не должен использоваться. В CAF его заменяет новый класс RemoteMediaClient , который обеспечивает эквивалентную функциональность в более удобном API. Нет необходимости явно инициализировать или регистрировать этот объект; платформа автоматически создаст экземпляр объекта и зарегистрирует базовый медиа-канал во время начала сеанса, если подключаемое приложение веб-приемника поддерживает пространство имен мультимедиа.

Доступ 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 .

Вводное наложение

Версия 2 не предоставляет вводного пользовательского интерфейса.

CAF предоставляет настраиваемое представление IntroductoryOverlay для выделения кнопки трансляции, когда она впервые отображается пользователям.

Мини-контроллер

В версии 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.