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ş şekliyle ilgili daha fazla bilgi için Web Alıcı Reklam Aralarına Genel Bakış bölümüne göz atın.
Aralar hem gönderen hem de alıcıda belirtilebilir. Bununla birlikte, platformlar arasında tutarlı bir davranış sağlamak için bunların Web Alıcı ve Android TV Alıcısı'nda belirtilmesi önerilir.
Android'de AdBreakClipInfo
ve AdBreakInfo
ifadelerini kullanarak bir yükleme komutunda reklam araları 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 ekle
Bir gönderen uygulaması, özel işlemleri gerçekleştirmek veya davranışını geçersiz kılmak için MediaIntentReceiver
öğesini genişletebilir. Kendi MediaIntentReceiver
uygulamanızı uyguladıysanız bunu manifest'e eklemeniz ve CastMediaOptions
bölümünde adını da ayarlamanız gerekir. Bu örnek, uzaktan medya oynatmayı açma/kapatma düğmesini geçersiz kılan, medya düğmesine ve diğer işlem türlerine basan özel işlemler sağlar.
// 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 ekle
Gönderen uygulamanın alıcı uygulamayla iletişim kurabilmesi için ö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 çok özel kanala sahip olmak mümkündür. 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 setMessageReceivedCallbacks
yöntemi kullanılarak özel kanal 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, dize kanallarını alıcıya 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ı destekliyor
API'leri Otomatik Oynatma ve Sıraya Alma bölümünü inceleyin.
Kullanıcı deneyimi widget'ları için resim seçimini geçersiz kıl
Çerçevenin çeşitli bileşenleri (yani Yayınlama iletişim kutusu, mini denetleyici ve yapılandırıldıysa UIMediaController) o anda yayınlanan medyanın çizimini gösterir. Resim çiziminin URL'leri genellikle medya için MediaMetadata
özelliğine dahil edilir, ancak gönderen uygulamanın URL'ler için alternatif bir kaynağı olabilir.
ImagePicker
sınıfı, MediaMetadata
kullanımındaki resim listesinden uygun bir resim (ör. bildirimin küçük resmi veya tam ekran arka planın kullanılması) temel alan bir yöntem seçer. Varsayılan ImagePicker
uygulaması her zaman ilk resmi seçer veya MediaMetadata
içinde hiç resim yoksa boş değerini döndürür. Uygulamanız, ImagePicker
alt sınıfı ekleyebilir ve alternatif bir uygulama sağlamak için onPickImage(MediaMetadata, ImageHints)
yöntemini geçersiz kılabilir ve ardından söz konusu alt sınıfı, CastMediaOptions.Builder
setImagePicker
yöntemiyle seçebilir.
ImageHints
, bir ImagePicker
için kullanıcı arayüzünde gösterilmek üzere seçilecek resmin türü ve boyutu hakkında ipuçları sağlar.
Yayın iletişim kutularını özelleştirme
SessionManager
ise oturum yaşam döngüsünü merkezi olarak yönetir. SessionManager
, Android'i dinler
MediaRouter
oturumları başlatmak, devam ettirmek ve sonlandırmak için seçim durumu değişikliklerini yönlendirir. Bir rota seçildiğinde SessionManager
, bir Session
nesnesi oluşturur ve 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 doğru şekilde yönetmesi için aşağıdakilerden emin olmanız gerekir:
- Rota seçici iletişim kutusunda, kullanıcı bir cihaz seçtiğinde
MediaRouter.selectRoute(MediaRouter.RouteInfo)
numaralı telefonu arayın. - Rota denetleyici iletişim kutusunda (bağlı durum veya yayınlanma durumunda) kullanıcı yayını durdurduğunda
MediaRouter.unselect(int)
numaralı telefonu arayın.
Yayınlama iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemlerin yapılması gerekebilir:
MediaRouteChooserDialog
veMediaRouteControllerDialog
kullanarak Yayın iletişim kutuları oluşturursanız bu iletişim kutuları,MediaRouter
bölümündeki rota seçimini otomatik olarak güncellediğinden hiçbir işlem yapmanız gerekmez.- Yayınla düğmenizi
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
veyaCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
kullanarak ayarlarsanız iletişim kutuları aslındaMediaRouteChooserDialog
veMediaRouteControllerDialog
ile oluşturulur. Bu nedenle herhangi bir işlem yapmanız gerekmez. - Diğer durumlarda, özel Cast iletişim kutuları oluşturduğunuzda,
MediaRouter
bölümündeki rota seçimi durumunu güncellemek için yukarıdaki talimatları uygulamanız gerekir.
Sonraki adımlar
Bu işlemle Android Gönderen uygulamanıza ekleyebileceğiniz özellikler tamamlanmıştır. Artık başka bir platform (iOS veya Web) için gönderen uygulaması oluşturabilir veya Web Alıcısı uygulaması oluşturabilirsiniz.