Android アプリに高度な機能を追加する

ミッドロール挿入点

Android Sender SDK は、Google 広告内での 指定することもできます。

詳しくは、 詳しくは、ウェブレシーバーのミッドロール挿入点の概要をご覧ください。 この動画をご覧ください

挿入点は送信者と受信者のどちらにも指定できますが、通常は Web Receiver および Android TV Receiver: 把握することができます

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" />
<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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) {
    }
}

カスタム チャネルを追加する

送信側アプリが受信側アプリと通信するには、アプリで次の操作を行う必要があります。 カスタムチャネルを作成します送信者はカスタム チャネルを使用して文字列を送信できます 受信します。各カスタム チャネルは固有の Namespace に接頭辞 urn:x-cast: を付ける必要があります。次に例を示します。 urn:x-cast:com.example.custom。1 つのテーブルに複数のカスタム それぞれ固有の名前空間を持ちます。受信側のアプリは メッセージを送受信する 同じ名前空間を使用します。

カスタム チャネルは 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);
    }
}

送信側アプリが受信側アプリに接続されると、カスタム チャネルは 作成するには、Terraform の 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);
        }
    }
}

自動再生をサポートする

詳しくは、自動再生とQueueing API

UX ウィジェットの画像選択をオーバーライドする

フレームワークのさまざまなコンポーネント(キャスト ダイアログ、ミニ UIMediaController(構成されている場合)がアートワークを表示する 。通常、画像アートワークの URL は メディアの MediaMetadata に含まれているが、送信側アプリに URL の代替ソースを指定します。

ImagePicker クラスは、画像のリストから適切な画像を選択する手段を定義します。 MediaMetadata で、画像(通知など)の使用に基づく サムネイルや全画面表示ですデフォルトの ImagePicker 実装 常に最初の画像が選択されます。または、指定された画像の中に使用可能な画像がない場合は null を返します。 MediaMetadata。アプリは ImagePicker をサブクラス化して、 onPickImage(MediaMetadata, ImageHints) メソッドを使用して代替の実装を提供し、そのサブクラスを 新しい setImagePicker CastMediaOptions.Builder のメソッドを使用します。 ImageHints 作成する画像のタイプとサイズに関する情報を ImagePicker に提供します。 UI で表示するように選択されています。

Cast ダイアログのカスタマイズ

セッション ライフサイクルの管理

SessionManager セッションのライフサイクルを一元的に管理する場所です。SessionManager 回再生しました Android へ MediaRouter セッションの開始、再開、終了に応じてルート選択状態が変化します。ルートの SessionManager を選択すると、 Session 開始または再開を試みます。ルートの選択を解除すると SessionManager は現在のセッションを終了します。

したがって、SessionManager でセッション ライフサイクルを適切に管理するには、以下を行う必要があります。 次の点を確認する必要があります。

キャスト ダイアログの作成方法によっては、追加の操作が必要になることがあります。 Done:

ゼロデバイスの状態

カスタムの Cast ダイアログを作成する場合は、 MediaRouteChooserDialog では、デバイスがない場合の できます。ダイアログには、アプリの開発時にユーザーが アプリが依然としてデバイスの検出を試行しており、検出の試行が成功しなかった場合 アクティブ状態が長くなります。

デフォルトの MediaRouteChooserDialog を使用している場合、ゼロデバイスの状態は 処理済みです

次のステップ

これで、Android の送信者アプリに追加できる機能は終了です。 別のプラットフォーム用の送信アプリを作成できるようになりました (iOSウェブ)、または ウェブ レシーバー アプリを作成します。