將 Android 傳送者應用程式從 Cast SDK v2 遷移至 Cast 應用程式架構 (CAF)

下列程序可協助您將 Android 發送端應用程式從 Cast SDK v2 轉換為 CAF 發送端,後者是以 CastContext 單例項為基礎。

Cast CAF 傳送器 SDK 會使用 CastContext 代表您管理 GoogleApiClient。CastContext 會為您管理生命週期、錯誤和回呼,大幅簡化 Cast 應用程式的開發作業。

簡介

  • CAF 傳送端仍會透過 Android SDK 管理工具,隨附在 Google Play 服務中發布
  • 新增的套件會負責遵守 Google Cast 設計檢查清單 (com.google.android.gms.cast.framework.*)
  • CAF 傳送器提供符合 Google Cast 使用者體驗規定的小工具;第 2 版則未提供任何 UI 元件,因此您必須實作這些小工具。
  • 使用 Cast API 時,不再需要使用 GoogleApiClient。
  • CAF 傳送器中的隱藏式輔助字幕與第 2 版類似。

依附元件

支援資料庫功能指南所述,V2 和 CAF 對於支援資料庫和 Google Play 服務 (9.2.0 以上版本) 的依附元件相同。

CAF 支援的最低 Android SDK 版本為 9 (Gingerbread)。

初始化

在 CAF 中,必須明確初始化 Cast 架構。這包括初始化 CastContext 單例項,並使用適當的 OptionsProvider 指定網頁接收器應用程式 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;
    }
}

在應用程式 AndroidManifest.xml 檔案的「application」標記中宣告 OptionsProvider

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

在第 2 版中,這些步驟並非必要。

探索裝置

在 CAF 中,當應用程式進入前景和背景時,架構會自動啟動及停止探索程序。請勿使用 MediaRouteSelectorMediaRouter.Callback

「投放」按鈕和「投放」對話方塊

與第 2 版相同,這些元件是由 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"/>

使用 CastButtonFactory 覆寫每個 Activity 的 onCreateOptionMenu() 方法,將 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 中,裝置控制功能大多由架構處理。傳送端應用程式不需要 (也不應嘗試) 使用 GoogleApiClient 處理連線至裝置和啟動網頁接收器應用程式。傳送者與 Web Receiver 之間的互動現在會以「工作階段」表示。SessionManager 類別會處理工作階段生命週期,並根據使用者手勢自動啟動及停止工作階段:使用者在 Cast 對話方塊中選取 Cast 裝置時,系統會啟動工作階段;使用者輕觸 Cast 對話方塊中的「停止投放」按鈕,或傳送端應用程式本身終止時,系統會結束工作階段。傳送端應用程式可以向 SessionManager 註冊 SessionManagerListener,接收工作階段生命週期事件的通知。SessionManagerListener 回呼會定義所有工作階段生命週期事件的回呼方法。

CastSession 類別代表與 Cast 裝置的工作階段。這個類別提供的方法可控制裝置音量和靜音狀態,先前在 v2 中是使用 Cast.CastApi 的方法。

在第 2 版中,Cast.Listener 回呼會提供裝置狀態變更的通知,包括音量、靜音狀態、待機狀態等。

在 CAF 中,音量/靜音狀態變更通知仍會透過 Cast.Listener 中的回呼方法傳送;這些接聽程式會向 CastSession 註冊。其餘所有裝置狀態通知都會透過 CastStateListener 回呼傳送;這些監聽器會向 CastSession 註冊。請務必在相關聯的片段、活動或應用程式進入背景時,取消註冊事件監聽器。

重新連線邏輯

與第 2 版相同,如果因暫時失去 Wi-Fi 訊號或其他網路錯誤而中斷連線,CAF 會嘗試重新建立網路連線。現在這項作業是在工作階段層級完成;連線中斷時,工作階段會進入「暫停」狀態,連線恢復時則會返回「已連線」狀態。架構會負責重新連線至 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 更方便使用。您不必明確初始化或註冊這個物件;如果連線的網頁接收器應用程式支援媒體命名空間,架構會在工作階段開始時自動例項化物件,並註冊基礎媒體管道。

RemoteMediaClient 可做為 CastSession 物件的 getRemoteMediaClient 方法存取。

在第 2 版中,RemoteMediaPlayer 上發出的所有媒體要求都會透過 PendingResult 回呼傳回 RemoteMediaPlayer.MediaChannelResult

在 CAF 中,在 RemoteMediaClient 上發出的所有媒體要求都會透過 PendingResult 回呼傳回 RemoteMediaClient.MediaChannelResult,可用於追蹤要求的進度和最終結果。

v2 RemoteMediaPlayer 會透過 RemoteMediaPlayer.OnStatusUpdatedListener,在網頁接收器上傳送媒體播放器狀態變更的通知。

在 CAF 中,RemoteMediaClient 會透過 RemoteMediaClient.Listener 介面提供對等的回呼。可向 RemoteMediaClient 註冊任意數量的監聽器,讓多個傳送器元件共用與工作階段相關聯的單一 RemoteMediaClient 例項。

在第 2 版中,傳送端應用程式必須負責讓使用者介面與 Web Receiver 上的媒體播放器狀態保持同步。

在 CAF 中,UIMediaController 類別會承擔大部分的責任。

入門重疊畫面

V2 不提供入門疊加 UI。

CAF 提供自訂檢視畫面 IntroductoryOverlay ,可在首次向使用者顯示時,醒目顯示 Cast 按鈕。

迷你遙控器

在第 2 版中,您需要在傳送端應用程式中從頭實作迷你控制器。

在 CAF 中,SDK 提供自訂檢視區塊 MiniControllerFragment,您可以將這個檢視區塊新增至要顯示迷你控制器的活動應用程式版面配置檔案。

通知和螢幕鎖定

在 v2 中,SDK 不提供通知和螢幕鎖定畫面控制器。 如要使用該 SDK,您必須使用 Android 架構 API,在傳送端應用程式中建構這些功能。

在 CAF 中,SDK 提供 NotificationsOptions.Builder,協助你在傳送器應用程式中,為通知和螢幕鎖定畫面建構媒體控制項。初始化 CastContext 時,可以使用 CastOptions 啟用通知和螢幕鎖定畫面控制項。

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 的程式碼研究室教學課程範例應用程式