以下程序可讓您將 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
也可以新增至活動 (使用
ActionBar
或
Toolbar
),
做為選單項目
<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
敬上
使用 SessionManager
。SessionManagerListener
回呼會定義
回呼方法。
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