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

您可以按照下列程序,將 Android 傳送端應用程式從 Cast SDK 2.0 轉換為 CAF 傳送端,後者是根據 CastContext 單例轉換。

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

簡介

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

依附元件

V2 和 CAF 對支援資料庫和 Google Play 服務 (9.2.0 以上版本) 的依附元件相同,詳情請參閱「支援資料庫功能指南

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

初始化

在 CAF 中,Cast 架構需要明確的初始化步驟。這項作業包括初始化 CastContext 單例,並使用適當的 OptionsProvider 指定 Web Receiver 應用程式 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>

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

使用 CastButtonFactoryMediaRouteButton 連結至 Cast 架構,藉此覆寫每個 Activity 的 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 啟動網路接收器應用程式。發送端和網頁接收端之間的互動現在會以「工作階段」表示。SessionManager 類別會處理工作階段生命週期,並會根據使用者手勢自動啟動及停止工作階段:當使用者在 Cast 對話方塊中選取 Cast 裝置時,系統會啟動工作階段;當使用者輕觸 Cast 對話方塊中的「停止投放」按鈕,或當傳送端應用程式本身終止時,系統會結束工作階段。如要通知傳送端應用程式工作階段生命週期事件,請使用 SessionManager 註冊 SessionManagerListenerSessionManagerListener 回呼會定義所有工作階段生命週期事件的回呼方法。

CastSession 類別代表與 Cast 裝置的會話。這個類別提供用於控制裝置音量和靜音狀態的方法,這項操作先前是在 v2 中使用 Cast.CastApi 上的方法完成。

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

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

重新連線邏輯

與 v2 一樣,CAF 會嘗試重新建立因暫時性 Wi-Fi 訊號中斷或其他網路錯誤而中斷的網路連線。這項作業現在是在工作階段層級執行;在連線中斷時,工作階段會進入「已暫停」狀態,並在連線恢復時轉回「已連線」狀態。這個架構會負責重新連線至 Web Receiver 應用程式,並在這個程序中重新連線至任何投放管道。

此外,CAF 也新增了自動工作階段恢復功能,預設為啟用狀態 (可透過 CastOptions 停用)。如果在 Cast 工作階段進行期間,傳送端應用程式遭到滑動移除或終止 (因當機而終止),則在傳送端應用程式返回前景或重新啟動時,架構會嘗試恢復該工作階段;這項作業會由 SessionManager 自動處理,並在任何已註冊的 SessionManagerListener 例項上發出適當的回呼。

自訂管道註冊

在 v2 中,系統會將自訂管道 (使用 Cast.MessageReceivedCallback 實作) 註冊至 Cast.CastApi。在 CAF 中,自訂管道會註冊至 CastSession 例項。您可以在 SessionManagerListener.onSessionStarted 回呼方法中完成註冊。對於媒體應用程式,您不再需要透過 Cast.CastApi.setMessageReceivedCallbacks 明確註冊媒體控制管道;詳情請參閱下文。

媒體管理

v2 類別 RemoteMediaPlayer 已淘汰,因此不應使用。在 CAF 中,這個類別已由新的 RemoteMediaClient 類別取代,後者在更方便的 API 中提供等同的功能。您不必明確初始化或註冊這個物件;如果連線的 Web Receiver 應用程式支援媒體命名空間,架構會在工作階段開始時自動例項化物件,並註冊底層媒體頻道。

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

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

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

v2 RemoteMediaPlayer 會透過 RemoteMediaPlayer.OnStatusUpdatedListener 傳送通知,說明 Web Receiver 上的媒體播放器狀態有何變動。

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

在 v2 中,傳送端應用程式必須負擔將使用者介面與網頁接收端上的媒體播放器狀態保持同步的負擔。

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

介紹重疊畫面

V2 不提供引導式疊加式 UI。

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

迷你控制器

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

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

已展開的控制器

在 v2 中,您需要在傳送端應用程式中從頭實作展開控制器。

CAF 提供 UIMediaController 輔助類別,方便您輕鬆建構自己的擴充控制器。

CAF 會新增預先建構的展開式控制器小工具 ExpandedControllerActivity,您可以輕鬆將其新增至應用程式。您不再需要使用 UIMediaController 實作自訂展開式控制器。

音訊焦點

在第 2 版中,您必須使用 MediaSessionCompat 管理音訊焦點。

在 CAF 中,系統會自動管理音訊焦點。

偵錯記錄功能

CAF 中沒有任何記錄選項。

範例應用程式

我們提供程式碼研究室教學課程和使用 CAF 的應用程式範例