為您的 Android 應用程式新增進階功能

廣告插播時間點

Android Sender SDK 支援在 針對特定媒體串流。

詳情請參閱 網路接收端廣告插播總覽瞭解詳情 瞭解廣告插播的運作方式

雖然你可以在傳送端和接收端中指定休息時間,但建議設定 「網路接收端」Android TV 接收器,保持一致 跨平台上的行為

在 Android 裝置上,請使用以下程式碼,在載入指令中指定廣告插播時間點 AdBreakClipInfo敬上 和 AdBreakInfo

Kotlin
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)
Java
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" />
Kotlin
// 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) {
    }
}
Java
// 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敬上 介面:

Kotlin
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")
    }
}
Java
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敬上 方法:

Kotlin
try {
    mCastSession.setMessageReceivedCallbacks(
        mHelloWorldChannel.namespace,
        mHelloWorldChannel)
} catch (e: IOException) {
    Log.e(TAG, "Exception while creating channel", e)
}
Java
try {
    mCastSession.setMessageReceivedCallbacks(
            mHelloWorldChannel.getNamespace(),
            mHelloWorldChannel);
} catch (IOException e) {
    Log.e(TAG, "Exception while creating channel", e);
}

建立自訂管道後,寄件者可以使用 sendMessage敬上 透過該管道將字串訊息傳送至接收器的方法:

Kotlin
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)
        }
    }
}
Java
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 妥善管理工作階段生命週期,您必須 必須確保:

視建立 Cast 對話方塊的方式而定,您可能需要執行其他動作 已完成:

零裝置狀態

如果您建立自訂的 Cast 對話方塊 MediaRouteChooserDialog 應該能妥善處理 找到。對話方塊中應有明確標示 應用程式仍會嘗試尋找裝置,且未嘗試探索 的運動時間。

如果您使用的是預設的 MediaRouteChooserDialog,表示裝置狀態為零 均已處理。

後續步驟

以上就是可新增至 Android 寄件者應用程式的功能。 現在可以為其他平台建構傳送者應用程式 (iOS網頁),或 建構網路接收端應用程式