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

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 öğ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" />
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 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:

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, bu kanal üzerinden alıcıya 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ı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:

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

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.