Reklam araları
Android Sender SDK, 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ında reklam aralarına genel bakış başlıklı makaleyi inceleyin.
Aranın hem gönderende hem de alıcıda belirtilmesi mümkün olsa da platformlar arasında tutarlı davranış sergilenmesi için aranın Web Receiver ve Android TV Receiver'da 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şlemler ekleme
Gönderen uygulaması, özel işlemleri işlemek veya davranışını geçersiz kılmak için
MediaIntentReceiver
işlevini genişletebilir. Kendi MediaIntentReceiver
öğenizi uyguladıysanız bunu manifeste 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 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ı ile tanımlanır ve urn:x-cast:
ön ekiyle başlamalıdır (örneğin, 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 setMessageReceivedCallbacks
yöntemini kullanarak ö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, bu kanal üzerinden alıcıya 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 oynatma desteği
Otomatik oynatma ve sıraya alma 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 (yani Cast iletişim kutusu, mini denetleyici ve UIMediaController, yapılandırılmışsa) şu anda yayınlanan medya için albüm kapaklarını gösterir. Resim öğesinin URL'leri genellikle medyanın MediaMetadata
öğesine dahil edilir ancak gönderen uygulama, URL'ler için alternatif bir kaynağa sahip olabilir.
ImagePicker
sınıfı, resmin kullanımına (ör. bildirim küçük resmi veya tam ekran arka planı) göre MediaMetadata
içindeki resimler listesinden uygun bir resim seçme yöntemini tanımlar. Varsayılan ImagePicker
uygulaması her zaman ilk resmi seçer veya ImagePicker
içinde resim yoksa null döndürür.MediaMetadata
Uygulamanız, alternatif bir uygulama sağlamak için ImagePicker
sınıfının alt sınıfını oluşturabilir ve 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
bir ImagePicker
'ye, kullanıcı arayüzünde gösterilmek üzere seçilecek resmin türü ve boyutu hakkında ipuçları verir.
Cast 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 kullanılan merkezi yerdir. SessionManager
, oturumları başlatmak, devam ettirmek ve sonlandırmak için Android'deki
MediaRouter
rota seçimi durumu değişikliklerini dinler. Bir rota seçildiğinde SessionManager
, Session
nesnesi oluşturur ve bunu başlatmaya veya devam ettirmeye çalışır. Bir rota seçimi kaldırıldığında, SessionManager
geçerli oturumu sonlandırır.
Bu nedenle, SessionManager
'nın oturum yaşam döngülerini düzgün şekilde yönetmesini sağlamak için şunlardan emin olmanız gerekir:
- Rota seçici iletişim kutusunda,
kullanıcı bir cihaz seçtiğinde
MediaRouter.selectRoute(MediaRouter.RouteInfo)
'i çağırın. - Rota denetleyicisi iletişim kutusunda (bağlı
durumda veya yayın
durumunda),
kullanıcı yayın yapmayı durdurduğunda
MediaRouter.unselect(int)
işlevini çağırın.
Yayın iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemler yapılması gerekebilir:
MediaRouteChooserDialog
veMediaRouteControllerDialog
kullanarak Cast iletişim kutuları oluşturursanız bu iletişim kutuları,MediaRouter
'daki 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ındaMediaRouteChooserDialog
veMediaRouteControllerDialog
kullanılarak oluşturulur. Bu nedenle, bu durumda da herhangi bir işlem yapmanız gerekmez. - Diğer durumlarda özel yayın iletişim kutuları oluşturacağınız için
MediaRouter
içinde rota seçimi 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
, sıfır cihaz bulunması durumunu düzgün şekilde işlemelidir. İletişim kutusunda, uygulamanızın cihaz bulmaya çalıştığı ve bulma girişiminin artık etkin olmadığı zamanları kullanıcılarınıza net bir şekilde bildiren göstergeler olmalıdır.
Varsayılan MediaRouteChooserDialog
kullanıyorsanız sıfır cihaz durumu
zaten işlenir.
Sonraki adımlar
Android gönderen uygulamanıza ekleyebileceğiniz özellikler burada sona eriyor. Artık başka bir platform (iOS veya Web) için gönderen uygulaması oluşturabilir ya da Web alıcı uygulaması oluşturabilirsiniz.