ミッドロール挿入点
Android Sender SDK は、Google 広告内での 指定することもできます。
詳しくは、 詳しくは、ウェブレシーバーのミッドロール挿入点の概要をご覧ください。 この動画をご覧ください
挿入点は送信者と受信者のどちらにも指定できますが、通常は Web Receiver および Android TV Receiver: 把握することができます
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) { } }
カスタム チャネルを追加する
送信側アプリが受信側アプリと通信するには、アプリで次の操作を行う必要があります。
カスタムチャネルを作成します送信者はカスタム チャネルを使用して、受信者に文字列メッセージを送信できます。各カスタム チャネルは一意の Namespace で定義され、接頭辞 urn:x-cast:
で始まる必要があります(例: urn:x-cast:com.example.custom
)。複数のカスタム チャネルを作成して、それぞれに固有の名前空間を設定できます。レシーバ アプリは、同じ Namespace を使用してメッセージを送受信することもできます。
カスタム チャネルは
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); } }
送信側アプリが受信側アプリに接続されると、カスタム チャネルは
作成するには、Terraform の
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); } } }
自動再生をサポートする
詳しくは、自動再生と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
セッションの開始、再開、終了に応じてルート選択状態が変化します。ルートを選択すると、SessionManager
は Session
オブジェクトを作成し、そのオブジェクトの開始または再開を試みます。ルートの選択を解除すると
SessionManager
は現在のセッションを終了します。
したがって、SessionManager
がセッションのライフサイクルを適切に管理するには、次のことを確認する必要があります。
- ルートセレクタ ダイアログで、次の操作を行います。
発信
MediaRouter.selectRoute(MediaRouter.RouteInfo)
ユーザーがデバイスを選択したとき。 - ルート コントローラ ダイアログ(接続済みの
state または
キャスティング
state),
発信
MediaRouter.unselect(int)
ユーザーがキャストを停止したとき。
キャスト ダイアログの作成方法によっては、追加の操作が必要になることがあります。 Done:
MediaRouteChooserDialog
とMediaRouteControllerDialog
を使用してキャスト ダイアログを作成すると、これらのダイアログによってMediaRouter
のルート選択が自動的に更新されるため、何もする必要はありません。- 「
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
またはCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
実際にダイアログがMediaRouteChooserDialog
とMediaRouteControllerDialog
を使用して作成されたため、 何もする必要はありません。 - それ以外の場合は、カスタムのキャスト ダイアログを作成するため、以下の操作が必要になります。
ルート選択の状態を更新するには、上記の手順に沿って
MediaRouter
。
ゼロデバイスの状態
カスタムの Cast ダイアログを作成する場合は、
MediaRouteChooserDialog
では、デバイスがない場合の
できます。ダイアログには、アプリの開発時にユーザーが
アプリが依然としてデバイスの検出を試行しており、検出の試行が成功しなかった場合
アクティブ状態が長くなります。
デフォルトの MediaRouteChooserDialog
を使用している場合、ゼロデバイスの状態は
処理済みです
次のステップ
これで、Android 送信アプリに追加できる機能はすべて説明しました。これで、別のプラットフォーム(iOS または ウェブ)の送信アプリを構築するか、ウェブ受信アプリを構築できます。