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

以下程序可讓您將 Android 傳送端應用程式從 Cast SDK v2 轉換為以 CastContext 單例為基礎的 CAF 傳送者。

Cast CAF Sender SDK 會使用 CastContext 代您管理 GoogleAPIClient。 CastContext 可為您管理生命週期、錯誤和回呼,可大幅簡化 Cast 應用程式的開發工作。

簡介

  • CAF 傳送者仍會使用 Android SDK Manager 做為 Google Play 服務中的一部分發布
  • 已新增套件,負責確保遵守 Google Cast 設計檢查清單 (com.google.android.gms.cast.framework.*)
  • CAF Sender 提供符合 Cast 使用者體驗規定的小工具;第 2 版不提供任何使用者介面元件,因此您必須實作這些小工具。
  • 使用 Cast API 時,不再需要使用 GoogleApiClient。
  • CAF 傳送者的隱藏式輔助字幕功能與 v2 類似,

依附元件

V2 和 CAF 在支援程式庫和 Google Play 服務 (9.2.0 以上版本) 上具有相同的依附元件,如支援資料庫功能指南所述

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

初始化

在 CAF 中,投放架構需要明確的初始化步驟。這包括使用適當的 OptionsProvider 指定 Web Receiver 應用程式 ID 和其他全域選項,初始化 CastContext 單例模式。

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>

在每個活動的 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"/>

使用 CastButtonFactoryMediaRouteButton 連接至 Cast 架構,藉此覆寫每個活動的 onCreateOptionMenu() 方法:

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 啟動 Web Receiver 應用程式。傳送者和網路接收器之間的互動現在是以「工作階段」表示。SessionManager 類別會處理工作階段生命週期,並根據使用者手勢自動啟動及停止工作階段:當使用者在「投放」對話方塊中選取投放裝置時,就會啟動工作階段;當使用者輕觸「投放」對話方塊中的「停止投放」按鈕,或傳送端應用程式本身終止時,工作階段就會結束。您可以使用 SessionManager 註冊 SessionManagerListener,讓傳送端應用程式收到工作階段生命週期事件的通知。SessionManagerListener 回呼會定義所有工作階段生命週期事件的回呼方法。

CastSession 類別代表具有投放裝置的工作階段。該類別提供控制裝置音量和靜音狀態的方法;先前在第 2 版中使用 Cast.CastApi 的方法完成這項設定。

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

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

重新連線邏輯

與第 2 版相同,CAF 會嘗試重新建立因暫時性 Wi-Fi 訊號中斷或其他網路錯誤而中斷的網路連線。目前是在工作階段層級完成;連線中斷時,工作階段可以進入「已暫停」狀態,並在恢復連線後切換回「已連線」狀態。這個架構會處理重新連線至 Web Receiver 應用程式的作業,並在過程中重新連結任何投放頻道。

此外,CAF 也會新增預設啟用的自動工作階段恢復功能,且可以透過 CastOptions 停用。如果傳送端應用程式傳送到背景或在投放工作階段執行期間終止 (滑動中斷或當機),架構就會在傳送端應用程式返回前景或重新啟動時,嘗試繼續執行該工作階段;SessionManager 會自動解決這個問題,並在任何已註冊的 SessionManagerListener 例項上發出適當的回呼。

自訂管道註冊

在第 2 版中,自訂管道 (使用 Cast.MessageReceivedCallback 導入) 會向 Cast.CastApi 註冊。在 CAF 中,自訂管道會透過 CastSession 執行個體註冊。註冊作業可在 SessionManagerListener.onSessionStarted 回呼方法中完成。以媒體應用程式來說,不再需要透過 Cast.CastApi.setMessageReceivedCallbacks 明確註冊媒體控制管道,詳情請參閱下一節。

媒體管理

第 2 版類別 RemoteMediaPlayer 已淘汰,因此不應使用。在 CAF 中,這已由新的 RemoteMediaClient 類別取代,該類別在更便利的 API 中提供對等的功能。您不需要明確初始化或註冊這個物件;如果連線的 Web Receiver 應用程式連線至支援媒體命名空間,架構就會在工作階段啟動時,自動將物件例項化,並註冊基礎媒體管道。

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

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

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

對於 Web 接收器上媒體播放器狀態的變化,第 2 版 RemoteMediaPlayer 會透過 RemoteMediaPlayer.OnStatusUpdatedListener 傳送通知。

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

在第 2 版中,傳送者應用程式必須承擔保持使用者介面與網路接收器狀態同步的負擔。

在 CAF 中,UIMediaController 類別負責執行大部分的這項責任。

簡介重疊

第 2 版未提供簡介重疊 UI。

CAF 提供自訂檢視 IntroductoryOverlay,可在使用者首次看到「投放」按鈕時醒目顯示。

迷你控制器

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

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

通知和螢幕鎖定

在第 2 版中,通知和螢幕鎖定的控制器並非由 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 的範例應用程式