Reklam Araları
Android Sender SDK'sı, belirli bir medya akışında 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ısı Reklam Aralarına Genel Bakış başlıklı makaleyi inceleyin.
Reklam araları hem gönderende 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 uygulaması, özel işlemleri işlemek veya davranışını geçersiz kılmak için MediaIntentReceiver sınıfını genişletebilir. Kendi MediaIntentReceiver öğenizi uyguladıysanız bunu manifest dosyasına eklemeniz ve adını CastMediaOptions içinde 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 gösterilmektedir.
// 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 kurması 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ıyla 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ınız olabilir. Alıcı uygulama, 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ıraya ekleme API'leri bölümüne bakın.
Kullanıcı deneyimi widget'ları için resim seçimini geçersiz kılma
Çerçevenin çeşitli bileşenleri (Cast iletişim kutusu, mini kumanda ve yapılandırılmışsa UIMediaController), yayınlanan medyanın posterini gösterir. Resim posterinin URL'leri genellikle medyanın MediaMetadata öğesine eklenir ancak gönderen uygulamanın URL'ler için alternatif bir kaynağı olabilir.
ImagePicker sınıfı, bir MediaMetadata içindeki resim listesinden uygun bir resim seçmek için bir yöntem tanımlar. Bu 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 değerini döndürür. Uygulamanız, ImagePicker sınıfının alt sınıfını oluşturabilir 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 bir resmin türü ve boyutu hakkında ImagePicker için 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önetmek için merkezi bir yerdir. SessionManager, oturumları başlatmak, devam ettirmek ve sonlandırmak için Android MediaRouter rota seçimi durum değişikliklerini dinler. Bir rota seçildiğinde SessionManager, bir Session nesnesi oluşturur ve bunu başlatmaya veya devam ettirmeye çalışır. Bir rota seçimi kaldırıldığında SessionManager mevcut oturumu sonlandırır.
Bu nedenle, SessionManager uygulamasının oturum yaşam döngülerini düzgün şekilde yönetmesi için şunlardan emin olmanız gerekir:
- Rota seçici iletişim kutusunda, kullanıcı bir cihaz seçtiğinde
MediaRouter.selectRoute(MediaRouter.RouteInfo)yöntemini çağırın. - Rota denetleyici iletişim kutusunda (bağlı durumda veya yayınlama durumunda), kullanıcı yayınlamayı durdurduğunda
MediaRouter.unselect(int)yöntemini çağırın.
Yayınlama iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemler yapılması gerekebilir:
MediaRouteChooserDialogveMediaRouteControllerDialogkullanarak yayınlama iletişim kutuları oluşturursanız bu iletişim kutularıMediaRouteriçindeki rota seçimini otomatik olarak günceller. Bu nedenle herhangi bir işlem yapmanız gerekmez.- Yayınla düğmenizi
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)veyaCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)kullanarak ayarladıysanız iletişim kutuları aslındaMediaRouteChooserDialogveMediaRouteControllerDialogkullanılarak oluşturulur. Bu nedenle, herhangi bir işlem yapmanız gerekmez. - Diğer durumlarda özel Yayınlama iletişim kutuları oluşturacağınız için
MediaRouteriçinde rota seçim durumunu güncellemek üzere yukarıdaki talimatları uygulamanız gerekir.
Cihaz Yok Durumu
Özel yayınlama iletişim kutuları oluşturursanız özel MediaRouteChooserDialog, sıfır cihaz bulunması durumunu doğru şekilde işlemelidir. İletişim kutusunda, uygulamanızın cihazları bulmaya çalıştığı ve keşif girişiminin artık etkin olmadığı zamanları kullanıcılarınıza açıkça gösteren göstergeler bulunmalıdır.
Varsayılan MediaRouteChooserDialog kullanıyorsanız sıfır cihaz durumu zaten işlenmiştir.
Sonraki adımlar
Android gönderen uygulamanıza ekleyebileceğiniz özellikler bu kadar. Artık başka bir platform (iOS veya Web) için gönderen uygulaması ya da Web Alıcı uygulaması oluşturabilirsiniz.