将 Android Sender 应用从 Cast SDK v2 迁移到 Cast 应用框架 (CAF)

您可通过以下步骤将 Android 发送器应用从 Cast 进行转换 SDK v2 转 CAF 发送器,该功能基于 CastContext 单例。

Cast CAF 发送器 SDK 使用 CastContext 代表您管理 GoogleAPIClient。 CastContext 可为您管理生命周期、错误和回调,这大大 可简化 Cast 应用的开发流程。

简介

  • CAF 发送器仍作为 Google Play 服务的一部分进行分发 使用 Android SDK 管理器
  • 已添加新软件包,这些软件包负责 Google Cast 设计核对清单 (com.google.android.gms.cast.framework.*)
  • CAF 发送器提供符合 Cast 用户体验要求的微件; v2 未提供任何界面组件,需要您实现这些组件 微件。
  • 现在,使用 Cast API 不再需要使用 GoogleApiClient。
  • CAF Sender 中的字幕与 v2 类似。

依赖项

V2 和 CAF 对支持库和 Google Play 的依赖项相同 服务(9.2.0 或更高版本),如支持库功能部分中所述 指南

CAF 支持的最低 Android SDK 版本是 9 (Gingerbread)。

初始化

在 CAF 中,Cast 框架需要显式初始化步骤。这个 包括初始化 CastContext 使用适当的 OptionsProvider 以指定 Web 接收器应用 ID 和任何其他全局选项。

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;
    }
}

在“application”内声明 OptionsProvider应用的代码 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>

在每个 activity 的 onCreate 方法中延迟初始化 CastContext

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

在 v2 中不需要这些步骤。

设备发现

在 CAF 中,发现过程由 框架(当应用进入前台并进入后台时), 。MediaRouteSelectorMediaRouter.Callback 不应 。

“投放”按钮和“投放”对话框

与在 v2 中一样,这些组件由 MediaRouter 支持 库

“投放”按钮仍由 MediaRouteButton 并可添加到您的活动中(使用 ActionBarToolbar), 作为菜单项显示。

<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"/>

使用以下代码替换每个 activity 的 onCreateOptionMenu() 方法: CastButtonFactoryMediaRouteButton 连接到 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。现在,发送方和网络接收器之间的交互 视为“会话”。通过 SessionManager 类处理会话生命周期并自动启动和停止会话, 响应用户手势:当用户选择 Cast 时,会启动一个会话 设备,并且会在用户点按“停止投放”后结束 按钮。发送者 通过向应用注册一个 SessionManagerListener SessionManagerSessionManagerListener 回调定义了 回调方法。

通过 CastSession 类表示与 Cast 设备的会话。该类包含 控制设备音量和静音状态,这在 v2 中是完成的 使用 Cast.CastApi 中的方法。

在 v2 中, Cast.Listener 回调提供的设备状态更改通知,包括 音量、静音状态、待机状态等。

在 CAF 中,音量/静音状态变化通知仍通过回调进行传送 Cast.Listener 中的方法;这些监听器通过 CastSession。 所有设备状态通知均通过 CastStateListener 回调;这些监听器是通过 CastSession 注册的。请确保您 在关联的 fragment、activity 或应用执行下列操作时,仍取消注册监听器 移到后台

重新连接逻辑

与 v2 一样,CAF 会尝试重新建立 会因为 Wi-Fi 信号暂时丢失或其他网络错误而丢失。现在是 是在会话级设置的会话可能会进入“已暂停”状态状态 并将恢复为“已连接”状态,当 连接就会恢复。框架负责重新连接到 Web Receiver 应用,并在此过程中重新连接任何 Cast 频道。

此外,CAF 还添加了自动会话恢复功能, 默认(可通过 CastOptions。 如果发送方应用被发送到后台或被终止( 滑动操作或由于崩溃)而投放时, 当发送者应用信息时,框架会尝试恢复该会话 返回前台或重新启动;由 SessionManager,它会对任何已注册 SessionManagerListener 个实例。

自定义渠道注册

在 v2 中,自定义渠道(使用 Cast.MessageReceivedCallback) 已向 Cast.CastApi 注册。在 CAF 中,自定义渠道改为通过 CastSession 实例。您可以在 SessionManagerListener.onSessionStarted 回调方法。对于媒体应用,则不再需要 通过 Cast.CastApi.setMessageReceivedCallbacks 注册媒体控制通道; 请参阅下一部分了解详情。

媒体控件

v2 类 RemoteMediaPlayer 已弃用,不应继续使用。在 CAF 中,它已被新的 RemoteMediaClient 类,后者在一个更方便的 API 中提供等效功能。时间是 无需显式初始化或注册此对象;框架 将自动实例化对象,并注册底层媒体 会话启动时,如果连接到 支持媒体命名空间。

RemoteMediaClient 可以作为 CastSession 对象的 getRemoteMediaClient 方法。

在 v2 中,在 RemoteMediaPlayer 上发出的所有媒体请求都会返回一个 通过 PendingResult 回调执行 RemoteMediaPlayer.MediaChannelResult

在 CAF 中,在 RemoteMediaClient 上发出的所有媒体请求都会返回一个 RemoteMediaClient.MediaChannelResult 通过 PendingResult 该回调函数可用于跟踪 请求。

v2 RemoteMediaPlayer 会发送有关媒体变化的通知 通过 RemoteMediaPlayer.OnStatusUpdatedListener

在 CAF 中,RemoteMediaClient 通过其 RemoteMediaClient.Listener 界面。可通过 RemoteMediaClient,可让多个发送者组件共享 与会话关联的 RemoteMediaClient 的单个实例。

在 v2 中,发送方应用程序必须承担让用户 与网络接收器上的媒体播放器状态同步。

在 CAF 中, UIMediaController Google 会承担大部分责任。

介绍性叠加层

V2 不提供介绍性的叠加层界面。

CAF 提供自定义视图 IntroductoryOverlay ,在“投射”按钮首次向用户显示时将其突出显示。

迷你控制器

在 v2 中,您需要在发送器应用中从头开始实现迷你控制器。

在 CAF 中,SDK 提供了自定义视图 MiniControllerFragment, 您可以将该标签添加到在其中的 activity 的应用布局文件中 显示迷你控制器

通知和锁定屏幕

在 v2 中,SDK 不提供通知和锁定屏幕的控制器。 对于该 SDK,您需要使用 Android 框架 API。

在 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();
}

展开的控制器

在 v2 中,您需要在 。

CAF 提供了 UIMediaController 帮助程序类,可让您轻松构建自己的展开式 控制器。

CAF 添加了一个预构建的展开控制器 widget ExpandedControllerActivity 您只需将其添加到自己的应用中即可。您无需再执行以下操作: 使用 UIMediaController 实现自定义展开式控制器。

音频焦点

在 v2 中,您需要使用 MediaSessionCompat 管理音频焦点。

在 CAF 中,系统会自动管理音频焦点。

调试日志记录

CAF 中没有日志记录选项。

示例应用

我们有 Codelab 教程示例应用 使用 CAF。