Android Uygulamanıza Gelişmiş Özellikler Ekleyin

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:

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

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 uygulama 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, sendMessage yöntemini kullanarak alıcıya bu kanal üzerinden dize mesajları gönderebilir:

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

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:

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

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.