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ısı Reklam Aralarına Genel Bakış bölümüne bakın.
Aralar hem gönderen hem de alıcı için belirtilebilir ancak platformlar arasında tutarlı bir davranış sağlanması için araların Web Alıcısı ve Android TV Alıcısı'nda belirtilmesi önerilir.
Android'de, AdBreakClipInfo
ve AdBreakInfo
özelliklerini 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 ekleyin
Gönderen uygulaması, özel işlemleri işlemek veya davranışını geçersiz kılmak için MediaIntentReceiver
'i genişletebilir. Kendi MediaIntentReceiver
öğenizi uyguladıysanız bunu manifeste eklemeniz ve ayrıca CastMediaOptions
içinde adını ayarlamanız gerekir. Bu örnekte, uzaktan medya oynatmayı, medya düğmesine basmayı 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 uygulamasını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ıyla tanımlanır ve urn:x-cast:
ön ekiyle başlamalıdır. Örneğin, urn:x-cast:com.example.custom
. Her biri benzersiz ad alanına sahip birden fazla özel kanalınız olabilir. 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 uygulaması 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 göz atın.
Kullanıcı deneyimi 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) yayınlanmakta olan medyanın posterini görüntüler. Resim resminin URL'leri genellikle medyaya ilişkin MediaMetadata
içinde yer alır, ancak gönderen uygulamanın bu URL'ler için alternatif bir kaynağı olabilir.
ImagePicker
sınıfı, MediaMetadata
içindeki resimler listesinden uygun bir resmi seçmek için bir aracı tanımlar. Bu yöntem, resmin kullanımına (örneğin, bildirim küçük resmi veya tam ekran arka planı) dayalı olarak yapılır. Varsayılan ImagePicker
uygulaması her zaman ilk resmi seçer veya MediaMetadata
içinde hiçbir resim yoksa null değerini döndürür. Uygulamanız, ImagePicker
alt sınıfını alt sınıflandırması yapabilir ve alternatif bir uygulama sağlamak için onPickImage(MediaMetadata, ImageHints)
yöntemini geçersiz kılabilir ve ardından bu alt sınıfı CastMediaOptions.Builder
setImagePicker
yöntemini kullanarak seçebilir.
ImageHints
, kullanıcı arayüzünde görüntülenmek üzere seçilecek bir resmin türü ve boyutu hakkında bir ImagePicker
için ipuçları sağlar.
Yayınlama iletişim kutularını özelleştirme
SessionManager
, oturum yaşam döngüsünü yönetmenin merkezidir. SessionManager
, Android
MediaRouter
oturumları başlatmak, devam ettirmek ve bitirmek için seçim durumu 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
, mevcut oturumu sonlandırır.
Bu nedenle, SessionManager
ürününün oturum yaşam döngülerini düzgün bir şekilde yönettiğinden emin olmak için:
- Bir kullanıcı cihaz seçtiğinde, rota seçici iletişim kutusunda
MediaRouter.selectRoute(MediaRouter.RouteInfo)
çağrısı yapın. - Kullanıcı yayını durdurduğunda rota denetleyici iletişim kutusunda (bağlı durumda veya yayınlama durumunda),
MediaRouter.unselect(int)
çağrısı yapın.
Yayınlama iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemler yapılması gerekebilir:
MediaRouteChooserDialog
veMediaRouteControllerDialog
kullanarak Yayınlama iletişim kutuları oluşturursanız bu iletişim kutularıMediaRouter
'daki rota seçimini otomatik olarak güncellediğinden herhangi bir işlem yapmanız gerekmez.- Yayın düğmenizi
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
veyaCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
kullanarak ayarlarsanız iletişim kutuları aslındaMediaRouteChooserDialog
veMediaRouteControllerDialog
kullanılarak oluşturulur, dolayısıyla hiçbir şey yapmanız gerekmez. - Diğer durumlarda özel Yayın iletişim kutuları oluşturacağınızdan
MediaRouter
ürününde rota seçim durumunu güncellemek için yukarıdaki talimatları uygulamanız gerekir.
Sonraki adımlar
Böylece, Android Gönderen uygulamanıza ekleyebileceğiniz özellikler tamamlanmış olur. Artık başka bir platform (iOS veya Web) için bir gönderen uygulaması veya bir Web Alıcısı uygulaması oluşturabilirsiniz.