Android TV uygulamalarında yayınlama özelliğini kullan

1. Genel bakış

Google Cast logosu

Bu codelab'de, mevcut bir Android TV uygulamasını mevcut Yayın gönderen uygulamalarınızdan yayın ve iletişimi destekleyecek şekilde nasıl değiştireceğinizi öğreneceksiniz.

Google Cast ve Cast Connect nedir?

Google Cast, kullanıcıların bir mobil cihazdan TV'ye içerik yayınlamasına olanak tanır. Tipik bir Google Cast oturumu iki bileşenden oluşur: gönderen ve alıcı uygulaması. Mobil uygulama veya YouTube.com gibi web sitesi gibi gönderen uygulamaları, Cast alıcı uygulamasının oynatılmasını başlatır ve kontrol eder. Yayın alıcı uygulamaları, Chromecast ve Android TV cihazlarında çalışan HTML 5 uygulamalarıdır.

Yayın oturumundaki durumun neredeyse tamamı alıcı uygulamada depolanır. Durum güncellendiğinde (örneğin, yeni bir medya öğesi yüklendiyse) tüm gönderenlere bir medya durumu yayınlanır. Bu yayınlar, Yayınlama oturumunun mevcut durumunu içerir. Gönderen uygulamaları, kullanıcı arayüzünde oynatma bilgilerini görüntülemek için bu medya durumunu kullanır.

Cast Connect, Android TV uygulamanız alıcı görevi görür. Bu altyapı üzerine kurulur. Cast Connect kitaplığı, Android TV uygulamanızın sanki bir yayın alıcı uygulaması gibi mesajları ve medya durumunu almasını sağlar.

Neyi inşa edeceğiz?

Bu codelab'i tamamladığınızda Android TV uygulamasına video yayınlamak için Cast gönderen uygulamalarını kullanabilirsiniz. Android TV uygulaması ayrıca Cast protokolü aracılığıyla gönderen uygulamalarıyla iletişim kurabilir.

Neler öğreneceksiniz?

  • Cast Connect kitaplığını örnek bir ATV uygulamasına ekleme.
  • Yayın gönderen bir kullanıcıyı bağlama ve ATV uygulamasını başlatma.
  • Yayın gönderen bir uygulama kullanarak ATV uygulamasında medya oynatma işlemini başlatma.
  • Medya durumunu ATV uygulamasından yayın gönderen uygulamalara gönderme.

Gerekenler

2. Örnek kodu alın

Örnek kodun tamamını bilgisayarınıza indirebilirsiniz...

indirilen zip dosyasını açın.

3. Örnek uygulamayı çalıştırma

Önce tamamlanmış örnek uygulamanın nasıl göründüğüne bakalım. Android TV uygulaması, Leanback kullanıcı arayüzünü ve temel video oynatıcıyı kullanır. Kullanıcı, listeden bir video seçebilir ve daha sonra seçildiğinde TV'de oynatılır. Cihazdaki mobil gönderen uygulaması sayesinde kullanıcılar, Android TV uygulamasında da video yayınlayabilir.

Bir videonun tam ekran önizlemesini kaplayan bir dizi video küçük resminin görüntüsü (biri vurgulanmıştır) ve sağ üstte "Cast Connect" ifadesi görünüyor

Geliştirici cihazlarını kaydetme

Uygulama geliştirmede Cast Connect özelliklerini etkinleştirmek için, kullanacağınız Android TV cihazının yerleşik Chromecast cihazının seri numarasını Cast Developer Console'da kaydetmeniz gerekir. Seri numarasını, Android TV'nizde Ayarlar > Cihaz Tercihleri > Chromecast Entegre > Seri numarası'na giderek bulabilirsiniz. Bunun, fiziksel cihazınızın seri numarasından farklı olduğunu ve yukarıda açıklanan yöntemden elde edilmesi gerektiğini unutmayın.

"Chromecast Entegre" ekranını, sürüm numarasını ve seri numarasını gösteren bir Android TV ekranının resmi

Cast Connect, kayıt olmadan güvenlik nedeniyle yalnızca Google Play Store'dan yüklenen uygulamalarda çalışır. Kayıt işlemini başlattıktan 15 dakika sonra cihazınızı yeniden başlatın.

Android gönderen uygulamasını yükleyin

Mobil cihazlardan gönderilen isteklerin test edilmesi için, kaynak kodu zip indirdiğini mobile-sender-0629.apk dosyası olarak Cast Videos adlı basit bir gönderen uygulaması sağladık. APK'yı yüklemek için ADB'den yararlanacağız. Yayın Videoları'nın farklı bir sürümünü zaten yüklediyseniz devam etmeden önce lütfen cihazdaki tüm profillerden bu sürümü kaldırın.

  1. Android telefonunuzda geliştirici seçeneklerini ve USB üzerinden hata ayıklamayı etkinleştirin.
  2. Android telefonunuzu geliştirme bilgisayarınıza bağlamak için USB veri kablosu takın.
  3. mobile-sender-0629.apk uygulamasını Android telefonunuza yükleyin.

mobile-sender.apk'yi yüklemek için adb yükleme komutunu çalıştıran bir terminal penceresinin resmi

  1. Video Yayınla gönderen uygulamasını Android telefonunuzda bulabilirsiniz. Cast Videoları gönderen uygulama simgesi

Android telefon ekranında çalışan Cast Video gönderen uygulamasının resmi

Android TV uygulamasını yükleyin

Aşağıdaki talimatlarda, tamamlanmış örnek uygulamanın Android Studio'da nasıl açılacağı ve çalıştırılacağı açıklanmaktadır:

  1. Karşılama ekranında Projeyi İçe Aktar'ı veya Dosya > Yeni > Projeyi İçe Aktar... menü seçeneklerini belirleyin.
  2. Örnek kod klasöründen klasör simgesiapp-done dizinini seçin ve Tamam'ı tıklayın.
  3. Dosya > Android App Studio'nun Gradle düğmesiyle Proje Senkronizasyonu Projeyi Gradle Dosyalarıyla Senkronize Et'i tıklayın.
  4. Android TV cihazınızda geliştirici seçeneklerini ve USB üzerinden hata ayıklamayı etkinleştirin.
  5. ADB, Android TV cihazınıza bağlanırsa cihaz Android Studio'da gösterilir. Android Studio araç çubuğunda görünen Android TV cihazını gösteren resim
  6. Sağı gösteren yeşil bir üçgen şeklindeki Android Studio Çalıştır düğmesiÇalıştır düğmesini tıklayın. Birkaç saniye sonra Cast Connect Codelab adlı ATV uygulamasını görürsünüz.

ATV ile Cast Connect uygulamasını oynatalım

  1. Android TV ana ekranına gidin.
  2. Android telefonunuzdan Yayın Video gönderen uygulaması'nı açın. Yayınla düğmesini Yayınla düğmesi simgesi tıklayın ve ATV cihazınızı seçin.
  3. Cast Connect Codelab ATV uygulaması ATV'nizde başlatılır ve göndereninizdeki Yayınla düğmesinde Ters renklerle yayın düğmesi simgesi bağlantısı gösterilir.
  4. ATV uygulamasından bir video seçin. Video, ATV'nizde oynatılmaya başlar.
  5. Cep telefonunuzda, gönderen uygulamanızın alt kısmında artık bir mini kumanda görünür. Oynatmayı kontrol etmek için oynat/duraklat düğmesini kullanabilirsiniz.
  6. Cep telefonundan bir video seçip oynat. Video, ATV'nizde oynatılmaya başlar ve mobil göndereninizde genişletilmiş kumanda gösterilir.
  7. Telefonunuzu kilitlediğinizde, kilidini açtığınızda medya oynatmayı kontrol etmek veya yayınlamayı durdurmak için kilit ekranında bir bildirim görürsünüz.

Video oynatan mini oynatıcının yer aldığı Android telefon ekranının bir bölümünün resmi

4. Başlangıç projesini hazırlama

Tamamlanmış uygulamanın Cast Connect entegrasyonunu doğruladığımıza göre, indirdiğiniz başlangıç uygulamasına Cast Connect için destek eklememiz gerekiyor. Artık Android Studio'yu kullanarak başlangıç projesinin temelini oluşturmaya hazırsınız:

  1. Karşılama ekranında Projeyi İçe Aktar'ı veya Dosya > Yeni > Projeyi İçe Aktar... menü seçeneklerini belirleyin.
  2. Örnek kod klasöründen klasör simgesiapp-start dizinini seçin ve Tamam'ı tıklayın.
  3. Dosya > Android Studio'nun Gradle düğmesiyle Projeyi Senkronize Et özelliği Projeyi Gradle Dosyalarıyla Senkronize Et'i tıklayın.
  4. ATV cihazını seçin ve Android Studio'nun Çalıştır düğmesi (sağı gösteren yeşil bir üçgen)Çalıştır'ı tıklayarak uygulamayı çalıştırın ve kullanıcı arayüzünü inceleyin. Seçili Android TV cihazını gösteren Android Studio araç çubuğu

Bir videonun tam ekran önizlemesini kaplayan bir dizi video küçük resminin görüntüsü (biri vurgulanmıştır) ve sağ üstte "Cast Connect" ifadesi görünüyor

Uygulama tasarımı

Uygulama, kullanıcının göz atabileceği bir video listesi sağlar. Kullanıcılar Android TV'de oynatmak üzere bir video seçebilir. Uygulama iki ana etkinlikten oluşuyor: MainActivity ve PlaybackActivity.

MainActivity

Bu etkinlik bir Parça (MainFragment) içeriyor. Video listesi ve ilişkili meta verileri MovieList sınıfında yapılandırılır ve Movie nesnelerinin listesini oluşturmak için setupMovies() yöntemi çağrılır.

Movie nesnesi; başlık, açıklama, küçük resimler ve video URL'sini içeren bir video öğesini temsil eder. Her Movie nesnesi, video küçük resmini başlık ve stüdyoyla sunmak için bir CardPresenter öğesine bağlanır ve ArrayObjectAdapter öğesine iletilir.

Bir öğe seçildiğinde, karşılık gelen Movie nesnesi PlaybackActivity öğesine iletilir.

PlaybackActivity

Bu etkinlik, ExoPlayer içeren bir VideoView, bazı medya denetimleri ve seçili videonun açıklamasını gösteren ve kullanıcının videoyu Android TV'de oynatmasına olanak tanıyan bir metin alanı barındıran bir Parça (PlaybackVideoFragment) içeriyor. Kullanıcı videoları oynatmak/duraklatmak veya oynatmak için uzaktan kumandayı kullanabilir.

Cast Connect'in Ön Koşulları

Cast Connect, Google Play Hizmetleri'nin yeni sürümlerini kullanır. Bu sürümler, AndroidX ad alanını kullanmak için ATV uygulamanızın güncellenmesini gerektirir.

Android TV uygulamanızda Cast Connect'i desteklemek için medya oturumundan etkinlik oluşturmanız ve desteklemeniz gerekir. Cast Connect kitaplığı, medya oturumunun durumuna göre medya durumu oluşturur. Medya oturumunuz, bir gönderenden duraklatma gibi belirli mesajları aldığında bunu belirtmek için Cast Connect kitaplığı tarafından da kullanılır.

5. Yayınlama Desteğini Yapılandırma

Bağımlılıklar

Uygulama build.gradle dosyasını gerekli kitaplık bağımlılıklarını içerecek şekilde güncelleyin:

dependencies {
    ....

    // Cast Connect libraries
    implementation 'com.google.android.gms:play-services-cast-tv:20.0.0'
    implementation 'com.google.android.gms:play-services-cast:21.1.0'
}

Proje derlemelerinin hatasız olduğunu onaylamak için projeyi senkronize edin.

Başlatma

CastReceiverContext, tüm Cast etkileşimlerini koordine eden bir tekil nesnedir. CastReceiverContext başlatıldığında CastReceiverOptions sağlamak için ReceiverOptionsProvider arayüzünü uygulamanız gerekir.

CastReceiverOptionsProvider.kt dosyasını oluşturun ve aşağıdaki sınıfı projeye ekleyin:

package com.google.sample.cast.castconnect

import android.content.Context
import com.google.android.gms.cast.tv.ReceiverOptionsProvider
import com.google.android.gms.cast.tv.CastReceiverOptions

class CastReceiverOptionsProvider : ReceiverOptionsProvider {
    override fun getOptions(context: Context): CastReceiverOptions {
        return CastReceiverOptions.Builder(context)
                .setStatusText("Cast Connect Codelab")
                .build()
    }
}

Ardından, AndroidManifest.xml uygulamasının <application> etiketinde alıcı seçenekleri sağlayıcısını belirtin:

<application>
  ...
  <meta-data
    android:name="com.google.android.gms.cast.tv.RECEIVER_OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.google.sample.cast.castconnect.CastReceiverOptionsProvider" />
</application>

Yayın gönderen cihazdan ATV uygulamanızla bağlantı kurmak için başlatmak istediğiniz etkinliği seçin. Bu codelab'de, Cast oturumu başlatıldığında uygulamanın MainActivity sürümünü kullanıma sunacağız. AndroidManifest.xml dosyasında, MainActivity bölümüne başlatma amacı filtresini ekleyin.

<activity android:name=".MainActivity">
  ...
  <intent-filter>
    <action android:name="com.google.android.gms.cast.tv.action.LAUNCH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Yayın Alıcısı Bağlamı Yaşam Döngüsü

Uygulamanız başlatıldığında CastReceiverContext başlatmalı, uygulamanız arka plana taşındığında CastReceiverContext durdurulmalıdır. CastReceiverContext.start() ve CastReceiverContext.stop() çağrılarını yönetmek için androidx.lifecycle kitaplığındaki LifecycleObserver öğesini kullanmanızı öneririz

MyApplication.kt dosyasını açın, uygulamanın onCreate yönteminde initInstance() yöntemini çağırarak yayın bağlamını başlatın. AppLifeCycleObserver sınıfında start(), uygulama devam ettirildiğinde CastReceiverContext ve uygulama duraklatıldığında stop():

package com.google.sample.cast.castconnect

import com.google.android.gms.cast.tv.CastReceiverContext
...

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        CastReceiverContext.initInstance(this)
        ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
    }

    class AppLifecycleObserver : DefaultLifecycleObserver {
        override fun onResume(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onResume")
            CastReceiverContext.getInstance().start()
        }

        override fun onPause(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onPause")
            CastReceiverContext.getInstance().stop()
        }
    }
}

MediaSession ile MediaManager arasında bağlantı kurma

MediaManager, CastReceiverContext teklisinin bir özelliğidir. Medya durumunu yönetir, yükleme amacını işler, gönderenlerden gelen medya ad alanı mesajlarını medya komutlarına çevirir ve medya durumunu gönderenlere geri gönderir.

MediaSession oluşturduğunuzda komutların nereye gönderileceğini ve medya oynatma durumunu alacağını bilebilmesi için geçerli MediaSession jetonunu MediaManager sağlayıcısına da sağlamanız gerekir. PlaybackVideoFragment.kt dosyasında, jetonu MediaManager olarak ayarlamadan önce MediaSession öğesinin başlatıldığından emin olun.

import com.google.android.gms.cast.tv.CastReceiverContext
import com.google.android.gms.cast.tv.media.MediaManager
...

class PlaybackVideoFragment : VideoSupportFragment() {
    private var castReceiverContext: CastReceiverContext? = null
    ...

    private fun initializePlayer() {
        if (mPlayer == null) {
            ...
            mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
            ...
            castReceiverContext = CastReceiverContext.getInstance()
            if (castReceiverContext != null) {
                val mediaManager: MediaManager = castReceiverContext!!.getMediaManager()
                mediaManager.setSessionCompatToken(mMediaSession!!.getSessionToken())
            }

        }
    }
}

Etkin olmayan oynatma nedeniyle MediaSession kartınızı serbest bıraktığınızda MediaManager üzerinde boş bir jeton ayarlamanız gerekir:

private fun releasePlayer() {
    mMediaSession?.release()
    castReceiverContext?.mediaManager?.setSessionCompatToken(null)
    ...
}

Örnek uygulamayı çalıştıralım

Uygulamayı ATV cihazınızda dağıtmak için Android Studio&#39;nun Çalıştır düğmesi (sağı gösteren yeşil bir üçgen)Çalıştır'ı tıklayın, uygulamayı kapatın ve ATV ana ekranına dönün. Gönderenden Yayınla düğmesini Yayınla düğmesi simgesi tıklayın ve ATV cihazınızı seçin. ATV cihazında ATV uygulamasının başlatıldığını ve Yayınla düğmesinin durumunun bağlandığını görürsünüz.

6. Medya Yükleniyor

Yükleme komutu, geliştirici konsolunda tanımladığınız paket adıyla birlikte bir intent aracılığıyla gönderilir. Bu niyeti alacak hedef etkinliği belirtmek için Android TV uygulamanıza aşağıdaki önceden tanımlanmış intent filtresini eklemeniz gerekir. AndroidManifest.xml dosyasında, yükleme amacı filtresini PlayerActivity öğesine ekleyin:

<activity android:name="com.google.sample.cast.castconnect.PlaybackActivity"
          android:launchMode="singleTask"
          android:exported="true">
  <intent-filter>
     <action android:name="com.google.android.gms.cast.tv.action.LOAD"/>
     <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Android TV'de Yükleme İsteklerini Yönetme

Bu etkinlik, bir yükleme isteği içeren bu intent'i alacak şekilde yapılandırıldığına göre söz konusu etkinliği işlememiz gerekir.

Etkinlik başladığında uygulama, processIntent adlı gizli bir yöntemi çağırır. Bu yöntem, gelen niyetlerin işlenmesine ilişkin mantığı içerir. Bir yükleme isteğini işlemek için bu yöntemi değiştirir ve MediaManager örneğinin onNewIntent yöntemini çağırarak amacı daha fazla işlenmek üzere göndeririz. MediaManager, amacın bir yükleme isteği olduğunu algılarsa amaçtan MediaLoadRequestData nesnesini ayıklar ve MediaLoadCommandCallback.onLoad() yöntemini çağırır. Yükleme isteğini içeren amacı işlemek için PlaybackVideoFragment.kt dosyasındaki processIntent yöntemini değiştirin:

fun processIntent(intent: Intent?) {
    val mediaManager: MediaManager = CastReceiverContext.getInstance().getMediaManager()
    // Pass intent to Cast SDK
    if (mediaManager.onNewIntent(intent)) {
        return
    }

    // Clears all overrides in the modifier.
    mediaManager.getMediaStatusModifier().clear()

    // If the SDK doesn't recognize the intent, handle the intent with your own logic.
    ...
}

Ardından, MediaManager tarafından çağrılan onLoad() yöntemini geçersiz kılacak MediaLoadCommandCallback soyut sınıfının kapsamını genişleteceğiz. Bu yöntem, yükleme isteğinin verilerini alır ve Movie nesnesine dönüştürür. Dönüştürüldükten sonra film, yerel oynatıcı tarafından oynatılır. Ardından MediaManager, MediaLoadRequest ile güncellenir ve MediaStatus öğesini bağlı gönderenlere yayınlar. PlaybackVideoFragment.kt dosyasında MyMediaLoadCommandCallback adında, iç içe yerleştirilmiş bir gizli sınıf oluşturun:

import com.google.android.gms.cast.MediaLoadRequestData
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.tv.media.MediaException
import com.google.android.gms.cast.tv.media.MediaCommandCallback
import com.google.android.gms.cast.tv.media.QueueUpdateRequestData
import com.google.android.gms.cast.tv.media.MediaLoadCommandCallback
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import android.widget.Toast
...

private inner class MyMediaLoadCommandCallback :  MediaLoadCommandCallback() {
    override fun onLoad(
        senderId: String?, mediaLoadRequestData: MediaLoadRequestData): Task<MediaLoadRequestData> {
        Toast.makeText(activity, "onLoad()", Toast.LENGTH_SHORT).show()
        return if (mediaLoadRequestData == null) {
            // Throw MediaException to indicate load failure.
            Tasks.forException(MediaException(
                MediaError.Builder()
                    .setDetailedErrorCode(MediaError.DetailedErrorCode.LOAD_FAILED)
                    .setReason(MediaError.ERROR_REASON_INVALID_REQUEST)
                    .build()))
        } else Tasks.call {
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            // Update media metadata and state
            val mediaManager = castReceiverContext!!.mediaManager
            mediaManager.setDataFromLoad(mediaLoadRequestData)
            mediaLoadRequestData
        }
    }
}

private fun convertLoadRequestToMovie(mediaLoadRequestData: MediaLoadRequestData?): Movie? {
    if (mediaLoadRequestData == null) {
        return null
    }
    val mediaInfo: MediaInfo = mediaLoadRequestData.getMediaInfo() ?: return null
    var videoUrl: String = mediaInfo.getContentId()
    if (mediaInfo.getContentUrl() != null) {
        videoUrl = mediaInfo.getContentUrl()
    }
    val metadata: MediaMetadata = mediaInfo.getMetadata()
    val movie = Movie()
    movie.videoUrl = videoUrl
    movie.title = metadata?.getString(MediaMetadata.KEY_TITLE)
    movie.description = metadata?.getString(MediaMetadata.KEY_SUBTITLE)
    if(metadata?.hasImages() == true) {
        movie.cardImageUrl = metadata.images[0].url.toString()
    }
    return movie
}

Geri çağırma tanımlandığına göre geri çağırmayı MediaManager'a kaydetmemiz gerekir. MediaManager.onNewIntent() çağrılmadan önce geri çağırmanın kaydedilmesi gerekir. Oynatıcı başlatıldığında setMediaLoadCommandCallback ekleyin:

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
        ...
        castReceiverContext = CastReceiverContext.getInstance()
        if (castReceiverContext != null) {
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            mediaManager.setSessionCompatToken(mMediaSession.getSessionToken())
            mediaManager.setMediaLoadCommandCallback(MyMediaLoadCommandCallback())
        }
    }
}

Örnek uygulamayı çalıştıralım

Uygulamayı ATV cihazınıza dağıtmak için Android Studio&#39;nun Çalıştır düğmesi (sağı gösteren yeşil bir üçgen)Çalıştır düğmesini tıklayın. Gönderenden Yayınla düğmesini Yayınla düğmesi simgesi tıklayın ve ATV cihazınızı seçin. ATV uygulaması, ATV cihazında başlatılır. Mobil cihazınızda bir video seçin. Video, ATV'de oynatılmaya başlar. Telefonunuzda, oynatma kontrollerinizin bulunduğu bir bildirim alıp almadığınızı kontrol edin. Duraklat gibi kontrolleri kullanmayı deneyin, ATV cihazında videonun duraklatılması gerekecek.

7. Yayın Kontrol Komutlarını Destekleme

Mevcut uygulama artık oynatma, duraklatma ve sarma gibi medya oturumlarıyla uyumlu temel komutları destekliyor. Ancak medya oturumunda kullanılamayan bazı Cast kontrol komutları vardır. Bu Cast kontrol komutlarını desteklemek için bir MediaCommandCallback kaydı yapmanız gerekir.

Oynatıcı başlatılırken setMediaCommandCallback kullanarak MediaManager örneğine MyMediaCommandCallback ekleyin:

private fun initializePlayer() {
    ...
    castReceiverContext = CastReceiverContext.getInstance()
    if (castReceiverContext != null) {
        val mediaManager = castReceiverContext!!.mediaManager
        ...
        mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
    }
}

Yöntemleri geçersiz kılmak için MyMediaCommandCallback sınıfı oluşturun (ör. onQueueUpdate()) bu Yayın kontrolü komutlarını desteklemek için:

private inner class MyMediaCommandCallback : MediaCommandCallback() {
    override fun onQueueUpdate(
        senderId: String?,
        queueUpdateRequestData: QueueUpdateRequestData
    ): Task<Void> {
        Toast.makeText(getActivity(), "onQueueUpdate()", Toast.LENGTH_SHORT).show()
        // Queue Prev / Next
        if (queueUpdateRequestData.getJump() != null) {
            Toast.makeText(
                getActivity(),
                "onQueueUpdate(): Jump = " + queueUpdateRequestData.getJump(),
                Toast.LENGTH_SHORT
            ).show()
        }
        return super.onQueueUpdate(senderId, queueUpdateRequestData)
    }
}

8. Medya Durumu ile çalışma

Medya Durumunu Değiştirme

Cast Connect, medya oturumundan temel medya durumunu alır. Gelişmiş özellikleri desteklemek için Android TV uygulamanız bir MediaStatusModifier aracılığıyla ek durum özelliklerini belirleyip geçersiz kılabilir. MediaStatusModifier, her zaman CastReceiverContext içinde ayarladığınız MediaSession üzerinde çalışır.

Örneğin, onLoad geri çağırması tetiklendiğinde setMediaCommandSupported değerini belirtmek için:

import com.google.android.gms.cast.MediaStatus
...
private class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
    fun onLoad(
        senderId: String?,
        mediaLoadRequestData: MediaLoadRequestData
    ): Task<MediaLoadRequestData> {
        Toast.makeText(getActivity(), "onLoad()", Toast.LENGTH_SHORT).show()
        ...
        return Tasks.call({
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            ...
            // Use MediaStatusModifier to provide additional information for Cast senders.
            mediaManager.getMediaStatusModifier()
                .setMediaCommandSupported(MediaStatus.COMMAND_QUEUE_NEXT, true)
                .setIsPlayingAd(false)
            mediaManager.broadcastMediaStatus()
            // Return the resolved MediaLoadRequestData to indicate load success.
            mediaLoadRequestData
        })
    }
}

Göndermeden Önce MediaStatus'a Müdahale Etme

Web alıcısı SDK'sının MessageInterceptor'ine benzer şekilde, MediaStatus cihazınızda ek değişiklikler yapmak için bağlı gönderenlere yayınlanmadan önce MediaManager içinde bir MediaStatusWriter belirtebilirsiniz.

Örneğin, mobil gönderenlere ileti göndermeden önce MediaStatus bölümünde özel veriler ayarlayabilirsiniz:

import com.google.android.gms.cast.tv.media.MediaManager.MediaStatusInterceptor
import com.google.android.gms.cast.tv.media.MediaStatusWriter
import org.json.JSONObject
import org.json.JSONException
...

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        if (castReceiverContext != null) {
            ...
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            ...
            // Use MediaStatusInterceptor to process the MediaStatus before sending out.
            mediaManager.setMediaStatusInterceptor(
                MediaStatusInterceptor { mediaStatusWriter: MediaStatusWriter ->
                    try {
                        mediaStatusWriter.setCustomData(JSONObject("{myData: 'CustomData'}"))
                    } catch (e: JSONException) {
                        Log.e(LOG_TAG,e.message,e);
                    }
            })
        }
    }
}        

9. Tebrikler

Artık Cast Connect Kitaplığı'nı kullanarak bir Android TV uygulamasını Cast ile nasıl etkinleştireceğinizi biliyorsunuz.

Daha fazla ayrıntı için geliştirici kılavuzuna göz atın: /cast/docs/android_tv_receiver.