廣告插播時間點
Android Sender SDK 支援在 針對特定媒體串流。
詳情請參閱 網路接收端廣告插播總覽瞭解詳情 瞭解廣告插播的運作方式
雖然你可以在傳送端和接收端中指定休息時間,但建議設定 「網路接收端」和 Android TV 接收器,保持一致 跨平台上的行為
在 Android 裝置上,請使用以下程式碼,在載入指令中指定廣告插播時間點
AdBreakClipInfo
敬上
和 AdBreakInfo
:
val breakClip1: AdBreakClipInfo = AdBreakClipInfo.Builder("bc0") .setTitle("Clip title") .setPosterUrl("https://www.some.url") .setDuration(60000) .setWhenSkippableInMs(5000) // Set this field so that the ad is skippable .build() val breakClip2: AdBreakClipInfo = … val breakClip3: AdBreakClipInfo = … val break1: AdBreakClipInfo = AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000) .setId("b0") .setBreakClipIds({"bc0","bc1","bc2"}) … .build() val mediaInfo: MediaInfo = MediaInfo.Builder() … .setAdBreaks({break1}) .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .build() val mediaLoadRequestData: MediaLoadRequestData = MediaInfo.Builder() … .setMediaInfo(mediaInfo) .build() remoteMediaClient.load(mediaLoadRequestData)
AdBreakClipInfo breakClip1 = new AdBreakClipInfo.Builder("bc0") .setTitle("Clip title") .setPosterUrl("https://www.some.url") .setDuration(60000) .setWhenSkippableInMs(5000) // Set this field so that the ad is skippable .build(); AdBreakClipInfo breakClip2 = … AdBreakClipInfo breakClip3 = … AdBreakInfo break1 = new AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000) .setId("b0") .setBreakClipIds({"bc0","bc1","bc2"}) … .build(); MediaInfo mediaInfo = new MediaInfo.Builder() … .setAdBreaks({break1}) .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .build(); MediaLoadRequestData mediaLoadRequestData = new MediaInfo.Builder() … .setMediaInfo(mediaInfo) .build(); remoteMediaClient.load(mediaLoadRequestData);
新增自訂動作
寄件者應用程式可以
MediaIntentReceiver
敬上
處理自訂動作或覆寫其行為。如果您已導入
自己的MediaIntentReceiver
,您需要將其新增至資訊清單,並設定相關
在 CastMediaOptions
中。這個範例提供的自訂動作
覆寫遠端媒體播放模式,按下媒體按鈕和其他類型
行動
// In AndroidManifest.xml
<receiver android:name="com.example.MyMediaIntentReceiver" />
// In your OptionsProvider var mediaOptions = CastMediaOptions.Builder() .setMediaIntentReceiverClassName(MyMediaIntentReceiver::class.java.name) .build() // Implementation of MyMediaIntentReceiver internal class MyMediaIntentReceiver : MediaIntentReceiver() { override fun onReceiveActionTogglePlayback(currentSession: Session) { } override fun onReceiveActionMediaButton(currentSession: Session, intent: Intent) { } override fun onReceiveOtherAction(context: Context?, action: String, intent: Intent) { } }
// In your OptionsProvider CastMediaOptions mediaOptions = new CastMediaOptions.Builder() .setMediaIntentReceiverClassName(MyMediaIntentReceiver.class.getName()) .build(); // Implementation of MyMediaIntentReceiver class MyMediaIntentReceiver extends MediaIntentReceiver { @Override protected void onReceiveActionTogglePlayback(Session currentSession) { } @Override protected void onReceiveActionMediaButton(Session currentSession, Intent intent) { } @Override protected void onReceiveOtherAction(Context context, String action, Intent intent) { } }
新增自訂管道
如要讓傳送端應用程式與接收端應用程式通訊,您的應用程式必須符合以下條件:
您可以建立自訂管道寄件者可以使用自訂管道來傳送字串
訊息傳給接收器。每個自訂管道都是由不重複的
命名空間,且開頭必須為 urn:x-cast:
,例如
urn:x-cast:com.example.custom
。您可以在同一個網頁中
每個管道都有專屬的命名空間接收端應用程式也可以
收發訊息
使用相同的命名空間
自訂頻道是在導入時
Cast.MessageReceivedCallback
敬上
介面:
class HelloWorldChannel : MessageReceivedCallback { val namespace: String get() = "urn:x-cast:com.example.custom" override fun onMessageReceived(castDevice: CastDevice, namespace: String, message: String) { Log.d(TAG, "onMessageReceived: $message") } }
class HelloWorldChannel implements Cast.MessageReceivedCallback { public String getNamespace() { return "urn:x-cast:com.example.custom"; } @Override public void onMessageReceived(CastDevice castDevice, String namespace, String message) { Log.d(TAG, "onMessageReceived: " + message); } }
傳送方應用程式連線至接收器應用程式後,自訂管道就可以
是使用
setMessageReceivedCallbacks
敬上
方法:
try { mCastSession.setMessageReceivedCallbacks( mHelloWorldChannel.namespace, mHelloWorldChannel) } catch (e: IOException) { Log.e(TAG, "Exception while creating channel", e) }
try { mCastSession.setMessageReceivedCallbacks( mHelloWorldChannel.getNamespace(), mHelloWorldChannel); } catch (IOException e) { Log.e(TAG, "Exception while creating channel", e); }
建立自訂管道後,寄件者可以使用
sendMessage
敬上
透過該管道將字串訊息傳送至接收器的方法:
private fun sendMessage(message: String) { if (mHelloWorldChannel != null) { try { mCastSession.sendMessage(mHelloWorldChannel.namespace, message) .setResultCallback { status -> if (!status.isSuccess) { Log.e(TAG, "Sending message failed") } } } catch (e: Exception) { Log.e(TAG, "Exception while sending message", e) } } }
private void sendMessage(String message) { if (mHelloWorldChannel != null) { try { mCastSession.sendMessage(mHelloWorldChannel.getNamespace(), message) .setResultCallback( status -> { if (!status.isSuccess()) { Log.e(TAG, "Sending message failed"); } }); } catch (Exception e) { Log.e(TAG, "Exception while sending message", e); } } }
支援自動播放
請參閱「自動播放與」一節:將 API 排入佇列。
覆寫使用者體驗小工具的圖片選取設定
架構的各種元件 (例如 Cast 對話方塊、小型應用程式)
控制器和 UIMediaController (如果設定的話) 將顯示
瞭解目前投放媒體的狀態圖片圖片的網址通常
包含在媒體的 MediaMetadata
中,但傳送方應用程式可能有
替代來源。
ImagePicker
敬上
類別會定義從圖片清單中選取適當圖片的方法
在 MediaMetadata
中 (根據圖片用途,如通知)
縮圖或全螢幕背景。預設的 ImagePicker
實作方式
永遠選擇第一張圖片;如果要求包含沒有圖片,則傳回空值
MediaMetadata
。應用程式可將 ImagePicker
設為子類別,並覆寫
onPickImage(MediaMetadata, ImageHints)
方法提供替代實作方式,然後選取該子類別
使用
setImagePicker
CastMediaOptions.Builder
方法。
ImageHints
敬上
為 ImagePicker
提供圖片類型和大小的提示
並已選取在 UI 中顯示
自訂 Cast 對話方塊
管理工作階段生命週期
SessionManager
敬上
是管理工作階段生命週期的核心。播放次數:SessionManager
轉移到 Android
MediaRouter
路徑選取狀態會變更為開始、繼續和結束工作階段。當路線是
已選取 SessionManager
就會建立
Session
物件並嘗試啟動或繼續。在未選取路線時
「SessionManager
」會結束目前的工作階段。
因此,為確保 SessionManager
妥善管理工作階段生命週期,您必須
必須確保:
- 在路徑選取器對話方塊中
通話
MediaRouter.selectRoute(MediaRouter.RouteInfo)
敬上 使用者選取裝置時觸發。 - 在路徑控制器對話方塊中 (位於已連線
州/省或
投放
state),
通話
MediaRouter.unselect(int)
使用者停止投放時。
視建立 Cast 對話方塊的方式而定,您可能需要執行其他動作 已完成:
- 如果您使用
MediaRouteChooserDialog
敬上 和MediaRouteControllerDialog
、 這些對話方塊會自動更新MediaRouter
中的路徑選項。 不必採取任何行動 - 如果你是使用
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
或CastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
, 那麼對話方塊就顯示了 已使用MediaRouteChooserDialog
和MediaRouteControllerDialog
建立 你也不必採取任何行動 - 在其他情況下,你必須建立自訂 Cast 對話方塊,因此你必須:
請依照上述指示,在
MediaRouter
。
零裝置狀態
如果您建立自訂的 Cast 對話方塊
MediaRouteChooserDialog
應該能妥善處理
找到。對話方塊中應有明確標示
應用程式仍會嘗試尋找裝置,且未嘗試探索
的運動時間。
如果您使用的是預設的 MediaRouteChooserDialog
,表示裝置狀態為零
均已處理。
後續步驟
以上就是可新增至 Android 寄件者應用程式的功能。 現在可以為其他平台建構傳送者應用程式 (iOS 或 網頁),或 建構網路接收端應用程式。