ミッドロール挿入点
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" />
<ph type="x-smartling-placeholder">// 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
。1 つのテーブルに複数のカスタム
それぞれ固有の名前空間を持ちます。受信側のアプリは
メッセージを送受信する
同じ名前空間を使用します。
カスタム チャネルは
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 ウィジェットの画像選択をオーバーライドする
フレームワークのさまざまなコンポーネント(キャスト ダイアログ、ミニ
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
でセッション ライフサイクルを適切に管理するには、以下を行う必要があります。
次の点を確認する必要があります。
- ルートセレクタ ダイアログで、次の操作を行います。
発信
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、ウェブ) ウェブ レシーバー アプリを作成します。