Jeda Iklan
Android Sender SDK menyediakan dukungan untuk Jeda Iklan dan iklan pengiring dalam streaming media tertentu.
Lihat Ringkasan Jeda Iklan Penerima Web untuk mengetahui informasi selengkapnya informasi tentang cara kerja Jeda Iklan.
Meskipun jeda dapat ditentukan pada pengirim dan penerima, sebaiknya keduanya yang ditentukan di Penerima Web dan Penerima Android TV untuk menjaga konsistensi perilaku lintas platform.
Di Android, tentukan jeda iklan dalam perintah load menggunakan
AdBreakClipInfo
dan 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);
Menambahkan tindakan kustom
Aplikasi pengirim
dapat memperluas
MediaIntentReceiver
untuk menangani tindakan kustom atau mengganti perilakunya. Jika Anda telah menerapkan
MediaIntentReceiver
sendiri, Anda harus menambahkannya ke manifes, serta menyetel
dalam CastMediaOptions
. Contoh ini menyediakan tindakan kustom yang
mengganti pemutaran media jarak jauh, menekan tombol media, dan jenis
tindakan lainnya.
// 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) { } }
Tambahkan saluran khusus
Agar aplikasi pengirim dapat berkomunikasi dengan aplikasi penerima, aplikasi Anda harus
membuat saluran khusus. Pengirim dapat menggunakan saluran khusus untuk mengirim string
ke penerima. Setiap saluran khusus ditetapkan oleh
dan harus diawali dengan awalan urn:x-cast:
, misalnya,
urn:x-cast:com.example.custom
. Dimungkinkan untuk memiliki beberapa
masing-masing dengan namespace unik. Aplikasi penerima juga dapat
mengirim dan menerima pesan
menggunakan namespace yang sama.
Saluran kustom diimplementasikan dengan antarmuka
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); } }
Setelah aplikasi pengirim terhubung ke aplikasi penerima, saluran khusus dapat
dibuat menggunakan
setMessageReceivedCallbacks
berikut:
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); }
Setelah saluran khusus dibuat, pengirim dapat menggunakan
sendMessage
untuk mengirim pesan string ke penerima melalui saluran tersebut:
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); } } }
Mendukung putar otomatis
Lihat bagian API Putar Otomatis & Antrean.
Mengganti pemilihan gambar untuk widget UX
Berbagai komponen framework (yaitu dialog Cast,
pengontrol, dan UIMediaController, jika dikonfigurasi demikian) akan menampilkan karya seni
untuk media yang sedang ditransmisikan. URL ke ilustrasi gambar biasanya
disertakan dalam MediaMetadata
untuk media, tetapi aplikasi pengirim mungkin memiliki
sumber alternatif untuk URL.
Class
ImagePicker
menentukan cara untuk memilih gambar yang sesuai dari daftar gambar
dalam MediaMetadata
, berdasarkan penggunaan gambar, misalnya, thumbnail
notifikasi atau latar belakang layar penuh. Implementasi ImagePicker
default
selalu memilih gambar pertama, atau mengembalikan null jika tidak ada gambar yang tersedia
MediaMetadata
. Aplikasi Anda dapat membuat subclass ImagePicker
dan mengganti
metode
onPickImage(MediaMetadata, ImageHints)
untuk memberikan implementasi alternatif, lalu memilih subclass tersebut
dengan
metode
setImagePicker
dari CastMediaOptions.Builder
.
ImageHints
memberikan petunjuk ke ImagePicker
tentang jenis dan ukuran gambar yang akan
yang dipilih untuk ditampilkan di UI.
Menyesuaikan dialog Cast
Mengelola Siklus Proses Sesi
SessionManager
adalah tempat utama untuk mengelola siklus proses sesi. SessionManager
kali didengarkan
ke Android
MediaRouter
perubahan status pemilihan rute untuk memulai, melanjutkan, dan mengakhiri sesi. Saat rute adalah
dipilih, SessionManager
akan membuat
Session
dan mencoba memulai
atau melanjutkannya. Saat rute dibatalkan pilihannya,
SessionManager
akan mengakhiri sesi saat ini.
Oleh karena itu, untuk memastikan SessionManager
mengelola siklus proses sesi dengan benar,
harus memastikan bahwa:
- Pada dialog pemilih rute,
panggilan telepon
MediaRouter.selectRoute(MediaRouter.RouteInfo)
saat pengguna memilih perangkat. - Pada dialog pengontrol rute (baik dalam terhubung
status atau
melakukan transmisi
state),
panggilan telepon
MediaRouter.unselect(int)
saat pengguna menghentikan transmisi.
Bergantung pada cara Anda membuat dialog Cast, tindakan tambahan mungkin perlu selesai:
- Jika Anda membuat dialog Cast menggunakan
MediaRouteChooserDialog
danMediaRouteControllerDialog
, dialog ini akan memperbarui pemilihan rute diMediaRouter
secara otomatis, jadi tidak ada yang perlu dilakukan. - Jika Anda menyiapkan tombol Cast menggunakan
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
atauCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
, maka dialog tersebut sebenarnya dibuat menggunakanMediaRouteChooserDialog
danMediaRouteControllerDialog
, sehingga tidak ada yang perlu dilakukan juga. - Untuk kasus lain, Anda akan membuat dialog Transmisi kustom, sehingga Anda perlu
mengikuti petunjuk di atas untuk memperbarui status pemilihan rute di
MediaRouter
.
Status Perangkat Nol
Jika Anda membuat dialog Cast kustom,
MediaRouteChooserDialog
harus dapat menangani dengan benar jika tidak ada perangkat yang
ditemukan. Dialog harus memiliki indikator yang menjelaskan
kepada pengguna saat Anda
aplikasi masih berusaha menemukan perangkat dan bila upaya penemuan tidak
lagi aktif.
Jika Anda menggunakan MediaRouteChooserDialog
default, status perangkat nol
sudah ditangani.
Langkah berikutnya
Inilah fitur yang dapat Anda tambahkan ke aplikasi Pengirim Android. Sekarang Anda dapat membangun aplikasi pengirim untuk platform lain (iOS atau Web), atau membuat aplikasi Web Receiver.