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

以下程序可讓您將 Android 傳送端應用程式從 Cast 轉換 根據 SDK v2 至 CAF 傳送者 CastContext 單例模式

Cast CAF 傳送端 SDK 會使用 CastContext 代您管理 GoogleAPIClient。 CastContext 可為您管理生命週期、錯誤和回呼, 簡化投放應用程式的開發程序。

簡介

  • CAF 寄件者仍是 Google Play 服務的一部分 Android SDK Manager
  • 為遵守相關規定,我們加入了新的套件 Google Cast 設計檢查清單 (com.google.android.gms.cast.framework.*)
  • CAF 寄件者提供的小工具符合 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;
    }
}

在「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>

延後初始化每個活動的 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 中,探索程序會自動啟動及停止 當應用程式進入前景並進入背景時 。不應「MediaRouteSelector」和「MediaRouter.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"/>

使用以下項目覆寫每個活動的 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 中,裝置控制項大部分是由架構處理。寄件者 應用程式不需處理 (且不應嘗試處理) 並透過以下指令啟動 Web Receiver 應用程式 GoogleApiClient。現在已顯示傳送者與網路接收端之間的互動 視為「工作階段」 SessionManager敬上 類別會處理工作階段生命週期,並自動開始及停止工作階段 為回應使用者手勢:使用者選取「投放」後,工作階段就會開始 裝置顯示在「投放」對話方塊中,並在使用者輕觸 [停止投放] 時結束 按鈕,或傳送者應用程式自行終止時。寄件者 只要註冊 SessionManagerListener敬上 使用 SessionManagerSessionManagerListener 回呼會定義 回呼方法。

CastSession敬上 類別代表與投放裝置的工作階段。這個類別有 控制裝置音量和靜音狀態 (先前在第 2 版中為操作步驟) 在 Cast.CastApi 上使用方法。

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

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

重新連線邏輯

和第 2 版一樣,CAF 會嘗試重新建立網路連線, 或 Wi-Fi 訊號遺失。現在 在工作階段層級完成;工作階段可能會在使用者進入「暫停」狀態時狀態 連線中斷,且將切換回「已連線」狀態 連線恢復。架構會負責 在這個過程中,Web Receiver 應用程式並重新連結任何 Cast 頻道。

此外,CAF 也會加入自動恢復工作階段功能,方法是啟用 (且可透過以下方式停用: CastOptions。 如果傳送方應用程式傳送至背景或終止 (例如 由於投放工作階段期間發生當機或當機, 架構就會嘗試繼續執行該工作階段 返回前景或重新啟動;會自動處理這個值 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 發出的所有媒體要求都會傳回 RemoteMediaClient.MediaChannelResult 透過 PendingResult 回呼,可用來追蹤 請求。

第 2 版 RemoteMediaPlayer 會傳送媒體變更的通知 透過 RemoteMediaPlayer.OnStatusUpdatedListener

在 CAF 中,RemoteMediaClient 會透過其提供對等的回呼 RemoteMediaClient.Listener 存取 API任意數量的接聽程式可註冊為 RemoteMediaClient,可讓多個傳送端元件共用 與工作階段相關聯的 RemoteMediaClient 單一例項。

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

在 CAF 中 UIMediaController敬上 負責承擔大部分的責任

簡介重疊

第 2 版不提供簡介重疊使用者介面。

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

迷你控制器

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

在 CAF 中,SDK 提供自訂檢視畫面 MiniControllerFragment、 您可將其新增至活動的應用程式版面配置檔案, 顯示迷你控制器

通知和螢幕鎖定

在第 2 版中,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 新增了預建的展開控制器小工具 ExpandedControllerActivity敬上 就能輕鬆加入應用程式不再需要 使用 UIMediaController 實作自訂展開控制器。

音訊焦點

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

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

偵錯記錄功能

CAF 不提供記錄選項。

範例應用程式

我們 程式碼研究室教學課程範例應用程式 而且使用 CAF