Reklam araları
Android Sender SDK, belirli bir medya akışı içinde Reklam araları ve tamamlayıcı reklamlar için destek sağlar.
Reklam aralarının nasıl çalıştığı hakkında daha fazla bilgi için Web Alıcı 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ış sürdürebilmek için araların Web Alıcısı ve Android TV Alıcısı'nda belirtilmesi önerilir.
Android'de AdBreakClipInfo
ve AdBreakInfo
kullanarak 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 ekleyin
Gönderen uygulaması, özel işlemleri işlemek veya davranışını geçersiz kılmak için MediaIntentReceiver
öğesini genişletebilir. Kendi MediaIntentReceiver
uygulamanızı uyguladıysanız bunu manifest dosyasına eklemeniz ve CastMediaOptions
bölümünde de 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 sunulmaktadı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 ekleyin
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ıyla tanımlanır ve urn:x-cast:
önekiyle (ör. urn:x-cast:com.example.custom
) başlamalıdır. Her biri benzersiz bir ad alanına sahip olan birden fazla özel kanalınız olabilir. Alıcı uygulama, aynı ad alanını kullanarak mesaj gönderip alabilir de.
Ö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, 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 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ıl
Çerçevenin çeşitli bileşenleri (yani, Cast iletişim kutusu, mini denetleyici ve yapılandırılmışsa UIMediaController), o anda yayınlanan medya için poster görüntüler. Resim posterinin URL'leri genellikle medyanın MediaMetadata
bölümüne dahil edilir ancak gönderen uygulaması, URL'ler için alternatif bir kaynağa sahip olabilir.
ImagePicker
sınıfı, bildirim küçük resmi veya tam ekran arka planı gibi resmin kullanımına bağlı olarak MediaMetadata
içindeki resimler listesinden uygun bir resmi seçmek için bir yöntem tanımlar. 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, alternatif bir uygulama sağlamak için ImagePicker
alt sınıfını kullanabilir ve onPickImage(MediaMetadata, ImageHints)
yöntemini geçersiz kılabilir. Ardından bu alt sınıfı CastMediaOptions.Builder
setImagePicker
yöntemiyle seçebilir.
ImageHints
, ImagePicker
öğesine, kullanıcı arayüzünde görüntülenmek üzere seçilecek resmin türü ve boyutu hakkında ipuçları sağlar.
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önetebileceğiniz merkezi yerdir. SessionManager
, oturumları başlatmak, devam ettirmek ve sonlandırmak için Android MediaRouter
rota seçim durumu değişikliklerini dinler. Bir rota seçildiğinde SessionManager
, bir Session
nesnesi oluşturur ve rotayı başlatmaya veya devam ettirmeye çalışır. Bir rota seçilmediğinde,
SessionManager
geçerli oturumu sonlandırır.
Bu nedenle, SessionManager
hizmetinin oturum yaşam döngülerini doğru şekilde yönettiğinden emin olmak için aşağıdakilerden emin olmalısınız:
- Rota seçici iletişim kutusunda, kullanıcı bir cihazı seçtiğinde
MediaRouter.selectRoute(MediaRouter.RouteInfo)
çağrısı yapın. - Rota denetleyicisi iletişim kutusunda (bağlı durumda veya yayınlama durumunda), kullanıcı yayını durdurduğunda
MediaRouter.unselect(int)
çağrısı yapın.
Yayınlama iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemlerin yapılması gerekebilir:
MediaRouteChooserDialog
veMediaRouteControllerDialog
kullanarak Cast iletişim kutuları oluşturursanız bu iletişim kutularıMediaRouter
içindeki rota seçimini otomatik olarak günceller. Dolayısıyla herhangi 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
kullanılarak oluşturulur. Bu nedenle, herhangi bir şey yapmanız gerekmez. - Diğer durumlarda ise özel Cast iletişim kutuları oluşturduğunuzdan,
MediaRouter
ürününde 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
öğeniz, hiçbir cihaz bulunmasa bile düzgün bir şekilde işlem yapmalıdır. İletişim kutusunda, uygulamanız hâlâ cihazları bulmaya çalışırken ve keşif denemesi artık etkin olmadığında kullanıcılarınıza bunu belirten göstergeler bulunmalıdır.
Varsayılan MediaRouteChooserDialog
kullanıyorsanız sıfır cihaz durumu zaten işlenir.
Sonraki adımlar
Android Sender uygulamanıza ekleyebileceğiniz özellikler burada tamamlanıyor. Artık başka bir platform (iOS veya Web) için bir gönderen uygulaması ya da bir Web Alıcı uygulaması geliştirebilirsiniz.