Android Uygulamanıza Gelişmiş Özellikler Ekleyin

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:

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ş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" />
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 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:

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 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:

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

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.