Reklam araları
Android Gönderen SDK'sı, belirli bir medya akışındaki reklam araları ve tamamlayıcı reklamlar için destek sağlar.
Reklam aralarının işleyiş şekli hakkında daha fazla bilgi için Web Alıcı Reklam Aralarına Genel Bakış başlıklı makaleyi inceleyin.
Ara verme işlemleri hem gönderen hem de alıcıda belirtilebilir ancak platformlar arasında tutarlı bir davranış sağlamak için Web Alıcısı ve Android TV Alıcısı'nda belirtilmesi önerilir.
Android'de, AdBreakClipInfo
ve AdBreakInfo
kullanarak bir yükleme komutunda reklam aralarını belirtin:
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);
Özel işlem ekleme
Gönderen uygulamaları, özel işlemleri işlemek veya davranışını geçersiz kılmak için MediaIntentReceiver
sınıfını genişletebilir. Kendi MediaIntentReceiver
'ünüzü uyguladıysanız manifest dosyasına eklemeniz ve CastMediaOptions
'da adını ayarlamanız gerekir. Bu örnekte, uzaktan medya oynatmayı açma/kapatma, medya düğmesine basma ve diğer işlem türlerini geçersiz kılan özel işlemler sağlanmaktadır.
// 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) { } }
Özel kanal ekleme
Gönderen uygulamanın alıcı uygulamayla iletişim kurabilmesi için uygulamanızın özel bir kanal oluşturması gerekir. Gönderen, alıcıya dize mesajları göndermek için özel kanalı kullanabilir. Her özel kanal, benzersiz bir ad alanında tanımlanır ve urn:x-cast:
ön ekiyle başlamalıdır (ör. urn:x-cast:com.example.custom
). Her biri benzersiz bir ad alanına sahip birden fazla özel kanal oluşturabilirsiniz. Alıcı uygulama da aynı ad alanını kullanarak mesaj gönderip alabilir.
Özel kanal, Cast.MessageReceivedCallback
arayüzüyle uygulanır:
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); } }
Gönderen uygulama alıcı uygulamaya bağlandıktan sonra özel kanal, setMessageReceivedCallbacks
yöntemi kullanılarak oluşturulabilir:
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); }
Özel kanal oluşturulduktan sonra gönderen, alıcıya bu kanal üzerinden dize mesajları göndermek için sendMessage
yöntemini kullanabilir:
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); } } }
Otomatik oynatmayı destekleme
Otomatik oynatma ve sıra API'leri bölümüne bakın.
UX widget'ları için resim seçimini geçersiz kılma
Çerçevenin çeşitli bileşenleri (ör. Yayınlama iletişim kutusu, mini denetleyici ve yapılandırılmışsa UIMediaController), şu anda yayınlanan medyanın posterini gösterir. Resim posterinin URL'leri genellikle medya için MediaMetadata
öğesine dahil edilir ancak gönderen uygulamasının URL'ler için alternatif bir kaynağı olabilir.
ImagePicker
sınıfı, MediaMetadata
içindeki resim listesinden uygun bir resmin seçilmesini sağlar. Seçim, resmin kullanımına (ör. bildirim küçük resmi veya tam ekran arka plan) göre yapılır. Varsayılan ImagePicker
uygulaması her zaman ilk resmi seçer veya MediaMetadata
içinde resim yoksa null döndürür. Uygulamanız, ImagePicker
sınıfını alt sınıflandırabilir ve alternatif bir uygulama sağlamak için onPickImage(MediaMetadata, ImageHints)
yöntemini geçersiz kılabilir, ardından CastMediaOptions.Builder
sınıfının setImagePicker
yöntemiyle bu alt sınıfı seçebilir.
ImageHints
, kullanıcı arayüzünde gösterilmek üzere seçilecek resmin türü ve boyutu hakkında ImagePicker
'a ipuçları sağlar.
Yayınlama iletişim kutularını özelleştirme
Oturum yaşam döngüsünü yönetme
SessionManager
, oturum yaşam döngüsünü yönetmenin merkezi noktasıdır. SessionManager
, oturumları başlatmak, devam ettirmek ve sonlandırmak için Android'deki MediaRouter
rota seçimi durum değişikliklerini dinler. Bir rota seçildiğinde SessionManager
, Session
nesnesi oluşturur ve bu nesneyi başlatmaya veya devam ettirmeye çalışır. Bir rotanın seçimi kaldırıldığında SessionManager
geçerli oturumu sonlandırır.
Bu nedenle, SessionManager
'ün oturum yaşam döngülerini düzgün şekilde yönetmesini sağlamak için şunları yapmanız gerekir:
- Kullanıcı bir cihaz seçtiğinde rota seçici iletişim kutusunda
MediaRouter.selectRoute(MediaRouter.RouteInfo)
işlevini çağırın. - Yönlendirici iletişim kutusunda (bağlı durumda veya yayınlama durumunda), kullanıcı yayını durdurduğunda
MediaRouter.unselect(int)
işlevini çağırın.
Yayınlama iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemler yapmanız gerekebilir:
MediaRouteChooserDialog
veMediaRouteControllerDialog
kullanarak Cast iletişim kutuları oluşturursanız bu iletişim kutuları,MediaRouter
'deki rota seçimini otomatik olarak günceller. Bu nedenle herhangi bir işlem yapmanız gerekmez.- Yayınlama düğmenizi
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
veyaCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
kullanarak ayarlarsanız iletişim kutuları aslındaMediaRouteChooserDialog
veMediaRouteControllerDialog
kullanılarak oluşturulur. Bu nedenle, herhangi bir işlem yapmanız gerekmez. - Diğer durumlarda özel Cast iletişim kutuları oluşturacağınızdan,
MediaRouter
'te rota seçim durumunu güncellemek için yukarıdaki talimatları uygulamanız gerekir.
Sıfır Cihaz Durumu
Özel Cast iletişim kutuları oluşturursanız özel MediaRouteChooserDialog
, hiçbir cihaz bulunamadığında durumu düzgün şekilde ele almalıdır. İletişim kutusunda, uygulamanızın cihaz bulmaya devam edip etmediğini ve cihaz bulma denemesinin artık etkin olup olmadığını kullanıcılarınıza net bir şekilde gösteren göstergeler olmalıdır.
Varsayılan MediaRouteChooserDialog
değerini kullanıyorsanız sıfır cihaz durumu zaten ele alınmıştır.
Sonraki adımlar
Android Gönderen uygulamanıza ekleyebileceğiniz özellikler bu kadardır. Artık başka bir platform (iOS veya Web) için bir gönderen uygulaması veya Web Alıcı uygulaması derleyebilirsiniz.