Android Uygulamanıza Gelişmiş Özellikler Ekleyin

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 işleyiş şekli hakkında daha fazla bilgi için Web Alıcısı Reklam Aralarına Genel Bakış'a göz atın.

Hem gönderen hem de alıcı için aralar belirtilebilir. Bununla birlikte, platformlar arasında tutarlı davranışı sürdürmek için araların Web Alıcısı ve Android TV Alıcısı'nda belirtilmesi önerilir.

Android'de AdBreakClipInfo ve AdBreakInfo komutlarını kullanarak bir yükleme komutunda reklam aralarını belirtin:

Kotlin
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)
Java
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 genişletebilir. Kendi MediaIntentReceiver öğenizi uyguladıysanız bunu manifest dosyasına eklemeniz ve ayrıca CastMediaOptions içinde adını 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" />
Kotlin
// 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) {
    }
}
Java
// 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 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: önekiyle başlamalıdır. Örneğin, urn:x-cast:com.example.custom. Her biri benzersiz bir ad alanına sahip birden fazla özel kanalınız olabilir. Alıcı uygulama, aynı ad alanını kullanarak mesaj gönderip alabilir.

Özel kanal, Cast.MessageReceivedCallback arayüzüyle uygulanır:

Kotlin
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")
    }
}
Java
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:

Kotlin
try {
    mCastSession.setMessageReceivedCallbacks(
        mHelloWorldChannel.namespace,
        mHelloWorldChannel)
} catch (e: IOException) {
    Log.e(TAG, "Exception while creating channel", e)
}
Java
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:

Kotlin
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)
        }
    }
}
Java
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ılma

Çerçevenin çeşitli bileşenleri (ör. Cast iletişim kutusu, mini denetleyici ve yapılandırıldıysa UIMediaController) yayınlamakta olan medya için poster görüntüler. Resim resminin URL'leri genellikle medyaya ait MediaMetadata içinde bulunur, ancak gönderen uygulamanın URL'ler için alternatif bir kaynağı olabilir.

ImagePicker sınıfı, MediaMetadata içindeki resimler listesinden uygun resmi seçmek için bir araç tanımlar. Varsayılan ImagePicker uygulaması her zaman ilk resmi seçer veya MediaMetadata içinde hiçbir resim yoksa boş sonucunu döndürür. Uygulamanız, alternatif bir uygulama sağlamak için ImagePicker alt sınıfını kullanıp onPickImage(MediaMetadata, ImageHints) yöntemini geçersiz kılabilir ve ardından bu alt sınıfı CastMediaOptions.Builder setImagePicker yöntemiyle seçebilir. ImageHints, kullanıcı arayüzünde görüntülenmek üzere seçilecek bir görüntünün türü ve boyutu hakkında bir ImagePicker için 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önetmenin merkezidir. SessionManager, Android MediaRouter oturumları başlatmak, devam ettirmek ve bitirmek için rota seçimi durumu değişikliklerini dinler. Bir rota seçildiğinde, SessionManager bir Session nesnesi oluşturur ve bunu başlatmaya veya devam ettirmeye çalışır. Bir rota seçilmediğinde, SessionManager mevcut oturumu sonlandırır.

Bu nedenle, SessionManager ürününün oturum yaşam döngülerini doğru bir şekilde yönettiğinden emin olmak için şunlardan emin olmanız gerekir:

Yayın iletişim kutularını nasıl oluşturduğunuza bağlı olarak ek işlemler yapılması gerekebilir:

Sıfır Cihaz Durumu

Özel Cast iletişim kutuları oluşturursanız özel MediaRouteChooserDialog cihazınız, hiç cihaz bulunmaması durumunda düzgün şekilde işlem yapar. İletişim kutusunda, uygulamanız cihaz bulmaya devam ederken ve keşif girişimi artık etkin olmadığında kullanıcılarınıza bunu açıklayan göstergeler bulunmalıdır.

Varsayılan MediaRouteChooserDialog ayarını kullanıyorsanız sıfır cihaz durumu zaten işlenir.

Sonraki adımlar

Böylece Android Sender uygulamanıza ekleyebileceğiniz özellikler tamamlandı. Artık başka bir platform (iOS veya Web) için bir gönderen uygulaması oluşturabilir veya bir Web Alıcısı uygulaması oluşturabilirsiniz.