Reklam araları
Android Sender SDK, veri akışı sağlar.
Reklam aralarının işleyiş şekli hakkında daha fazla bilgi için Web Alıcı Reklam Aralarına Genel Bakış başlıklı makaleyi inceleyin.
Hem gönderen hem de alıcı için aralar belirtilse de araların hem gönderen hem de alıcı için belirtilmesi önerilir. Web Alıcısı'nda ve Tutarlılık için Android TV Alıcısı tespit etmiş olursunuz.
Android'de, aşağıdakileri kullanarak bir yükleme komutunda reklam araları belirtme:
AdBreakClipInfo
ve AdBreakInfo
:
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ı,
MediaIntentReceiver
özelliğini kullanın. Mevcut
MediaIntentReceiver
kullanıyorsanız bunu manifest dosyasına eklemeniz ve
CastMediaOptions
içindeki adı. 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 ekleyin
Gönderen uygulamanın alıcı uygulamayla iletişim kurabilmesi için uygulamanızın
bir özel kanal oluşturabilirsiniz. Gönderen, özel kanalı kullanarak
alıcıya iletebilir. Her özel kanal, benzersiz bir
ad alanına sahip olmalıdır ve urn:x-cast:
önekiyle başlamalıdır.
urn:x-cast:com.example.custom
. Birden fazla özel
kanal vardır. Her biri benzersiz bir ad alanına sahiptir. Alıcı uygulama ayrıca
mesaj gönderme ve alma
aynı ad alanını kullanır.
Ö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, sendMessage
yöntemini kullanarak alıcıya bu kanal üzerinden dize mesajları gönderebilir:
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
Daha fazla bilgi için Otomatik oynatma ve Sıraya alma API'leri
Kullanıcı deneyimi widget'ları için resim seçimini geçersiz kıl
Çerçevenin çeşitli bileşenleri (ör. Cast iletişim kutusu, mini
(yapılandırılmışsa UIMediaController) orijinal ekran görüntüsünü
şu anda yayınlanan medya için. Görselin URL'leri genelde
medya için MediaMetadata
öğesine dahil edilir, ancak gönderen uygulamasında
için alternatif bir kaynaktır.
İlgili içeriği oluşturmak için kullanılan
ImagePicker
sınıfı, görsel listesinden uygun bir resmi seçmek için bir yöntem tanımlar.
resmin kullanımına göre (ör. bildirim) MediaMetadata
veya tam ekran arka plan resmi seçin. Varsayılan ImagePicker
uygulaması
her zaman ilk resmi seçer veya
MediaMetadata
. Uygulamanız ImagePicker
alt sınıfını değiştirebilir ve
onPickImage(MediaMetadata, ImageHints)
yöntemini kullanın ve ardından ilgili alt sınıfı seçin.
şununla:
setImagePicker
CastMediaOptions.Builder
yöntemini kullanın.
ImageHints
ImagePicker
için, kullanılacak resmin türü ve boyutu hakkında ipuçları sağlar
kullanıcı arayüzünde görüntülenmek üzere seçilir.
Cast iletişim kutularını özelleştirme
Oturum Yaşam Döngüsünü Yönetme
SessionManager
oturum yaşam döngüsü yönetiminin merkezi
yer alır. SessionManager
dinleme
Android'e
MediaRouter
rota seçimi durumu, oturumları başlatacak, devam ettirecek ve sonlandıracak şekilde değişir. Bir rota
seçildikten sonra SessionManager
,
Session
ve bunu başlatmaya veya devam ettirmeye çalışır. Bir rota seçilmediğinde,
SessionManager
mevcut oturumu sonlandıracak.
Bu nedenle, SessionManager
ürününün oturum yaşam döngülerini doğru şekilde yönettiğinden emin olmak için
şunlardan emin olmalıdır:
- Rota seçici iletişim kutusunda,
telefon etmek
MediaRouter.selectRoute(MediaRouter.RouteInfo)
Kullanıcı bir cihazı seçtiğinde. - Rota denetleyicisi iletişim kutusunda (bağlı
durum veya
yayınlama
state),
telefon etmek
MediaRouter.unselect(int)
Kullanıcı yayını durdurduğunda.
Yayınlama iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemler tamamlandı:
MediaRouteChooserDialog
veMediaRouteControllerDialog
kullanarak Cast iletişim kutuları oluşturursanız bu iletişim kutuları,MediaRouter
'deki rota seçimini otomatik olarak günceller. Bu nedenle herhangi bir işlem yapmanız gerekmez.- Yayın düğmenizi
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
veyaCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
, diyaloglar aslındaMediaRouteChooserDialog
veMediaRouteControllerDialog
kullanılarak oluşturulduğu için yapılması gerekmez. - Diğer durumlarda ise özel Cast iletişim kutuları oluşturacağınız için
rota seçimi durumunu şurada güncellemek için yukarıdaki talimatları uygulayın:
MediaRouter
Sıfır Cihaz Durumu
Özel Cast iletişim kutuları oluşturursanız özel MediaRouteChooserDialog
, sıfır cihaz bulunduğunda durumu düzgün şekilde ele almalıdır. İletişim kutusunda,
Uygulama hâlâ cihazları bulmaya çalışıyor ve keşif denemesi başarısız olduğunda
daha uzun süre etkin.
Varsayılan MediaRouteChooserDialog
kullanıyorsanız sıfır cihaz durumu
zaten işleniyor.
Sonraki adımlar
Android Gönderen uygulamanıza ekleyebileceğiniz özellikler bu kadardır. Artık başka bir platform (iOS veya Web) için bir gönderen uygulaması veya Web Alıcı uygulaması derleyebilirsiniz.