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

ミッドロール挿入点

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

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

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

Android では、AdBreakClipInfoAdBreakInfo を使用して、読み込みコマンドでミッドロール挿入点を指定します。

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)
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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) {
    }
}
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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)。複数のカスタム チャネルを作成して、それぞれに固有の名前空間を設定できます。レシーバ アプリは、同じ Namespace を使用してメッセージを送受信することもできます。

カスタム チャネルは 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")
    }
}
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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)
}
をご覧ください。 <ph type="x-smartling-placeholder">
</ph>
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 ウィジェットの画像選択をオーバーライドする

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

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

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

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

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

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

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

ゼロデバイスの状態

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

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

次のステップ

これで、Android 送信アプリに追加できる機能はすべて説明しました。これで、別のプラットフォーム(iOS または ウェブ)の送信アプリを構築するか、ウェブ受信アプリを構築できます。