1. Przegląd

Z tego laboratorium dowiesz się, jak zmodyfikować istniejącą aplikację na Androida TV, aby obsługiwała przesyłanie i komunikację z dotychczasowymi aplikacjami nadawczymi Cast.
Co to jest Google Cast i Cast Connect?
Google Cast umożliwia przesyłanie treści z urządzenia mobilnego na telewizor. Typowa sesja Google Cast składa się z 2 komponentów – aplikacji nadawcy i aplikacji odbiorcy. Aplikacje wysyłające, takie jak aplikacja mobilna lub witryna, np. Youtube.com, inicjują i kontrolują odtwarzanie aplikacji odbiornika Cast. Aplikacje odbiornika przesyłania to aplikacje HTML5, które działają na urządzeniach Chromecast i Android TV.
Prawie wszystkie dane sesji Cast są przechowywane w aplikacji odbiornika. Gdy stan się zmieni, np. zostanie załadowany nowy element multimedialny, do wszystkich nadawców zostanie wysłany stan multimediów. Te transmisje zawierają aktualny stan sesji przesyłania. Aplikacje wysyłające używają tego stanu multimediów do wyświetlania informacji o odtwarzaniu w interfejsie.
Cast Connect korzysta z tej infrastruktury, a aplikacja na Androida TV działa jako odbiornik. Biblioteka Cast Connect umożliwia aplikacji na Androida TV odbieranie wiadomości i przesyłanie stanu multimediów tak, jakby była aplikacją odbiornika Cast.
Co będziemy tworzyć?
Po ukończeniu tego ćwiczenia z programowania będziesz w stanie używać aplikacji przesyłających treści do przesyłania filmów do aplikacji na Androida TV. Aplikacja na Androida TV może też komunikować się z aplikacjami przesyłającymi treści za pomocą protokołu Cast.
Czego się nauczysz
- Jak dodać bibliotekę Cast Connect do przykładowej aplikacji ATV.
- Jak połączyć nadajnik Cast i uruchomić aplikację ATV.
- Jak rozpocząć odtwarzanie multimediów w aplikacji ATV z aplikacji wysyłającej Cast.
- Jak wysyłać stan multimediów z aplikacji ATV do aplikacji wysyłających Cast.
Czego potrzebujesz
- Najnowszy Android SDK.
- Najnowsza wersja Android Studio. Chodzi o wersję
Chipmunk | 2021.2.1lub nowszą. - Urządzenie z Androidem TV, na którym włączono opcje programisty i debugowanie USB.
- telefon z Androidem, na którym włączono opcje programisty i debugowanie USB;
- Kabel USB do transmisji danych, który umożliwia połączenie telefonu z Androidem i urządzeń z Androidem TV z komputerem deweloperskim.
- Podstawowa wiedza na temat tworzenia aplikacji na Androida w języku Kotlin.
2. Pobieranie przykładowego kodu
Możesz pobrać cały przykładowy kod na komputer…
i rozpakuj pobrany plik ZIP.
3. Uruchamianie przykładowej aplikacji
Najpierw zobaczmy, jak wygląda gotowa przykładowa aplikacja. Aplikacja na Androida TV korzysta z interfejsu Leanback i podstawowego odtwarzacza wideo. Użytkownik może wybrać film z listy, który po wybraniu zostanie odtworzony na telewizorze. Za pomocą towarzyszącej aplikacji mobilnej nadawcy użytkownik może też przesyłać filmy do aplikacji na Androida TV.

Rejestrowanie urządzeń deweloperskich
Aby włączyć funkcje Cast Connect na potrzeby tworzenia aplikacji, musisz zarejestrować numer seryjny urządzenia z Androidem TV, którego będziesz używać w Konsoli programisty Cast. Numer seryjny znajdziesz w sekcji Ustawienia > Ustawienia urządzenia > Google Cast > Numer seryjny na Androidzie TV. Pamiętaj, że różni się on od numeru seryjnego urządzenia fizycznego i musisz go uzyskać za pomocą opisanej powyżej metody.

Bez rejestracji Cast Connect będzie działać tylko w przypadku aplikacji zainstalowanych ze Sklepu Google Play ze względów bezpieczeństwa. Po 15 minutach od rozpoczęcia procesu rejestracji zrestartuj urządzenie.
Instalowanie aplikacji nadawcy na Androida
Aby przetestować wysyłanie żądań z urządzenia mobilnego, udostępniliśmy prostą aplikację do wysyłania o nazwie Cast Videos as mobile-sender-0629.apk w pobranym pliku ZIP z kodem źródłowym. Do zainstalowania pliku APK użyjemy ADB. Jeśli masz już zainstalowaną inną wersję Cast Videos, przed kontynuowaniem odinstaluj ją ze wszystkich profili na urządzeniu.
- Włącz opcje programisty i debugowanie USB na telefonie z Androidem.
- Podłącz kabel USB do transmisji danych, aby połączyć telefon z Androidem z komputerem deweloperskim.
- Zainstaluj
mobile-sender-0629.apkna telefonie z Androidem.

- Aplikację wysyłającą Przesyłaj filmy znajdziesz na telefonie z Androidem.


Instalowanie aplikacji na Androida TV
Poniżej znajdziesz instrukcje otwierania i uruchamiania gotowej przykładowej aplikacji w Android Studio:
- Na ekranie powitalnym wybierz Importuj projekt lub kliknij Plik > Nowy > Importuj projekt….
- Wybierz katalog

app-donez folderu z przykładowym kodem i kliknij OK. - Kliknij Plik >
Synchronizuj projekt z plikami Gradle. - Włącz opcje programisty i debugowanie USB na urządzeniu z Androidem TV.
- Połącz się z urządzeniem z Androidem TV za pomocą ADB. Urządzenie powinno być widoczne w Android Studio.

- Kliknij przycisk
Uruchom. Po kilku sekundach powinna pojawić się aplikacja ATV o nazwie Cast Connect Codelab.
Zagrajmy w Cast Connect w aplikacji ATV
- Otwórz ekran główny Androida TV.
- Otwórz aplikację nadawczą Przesyłaj filmy na telefonie z Androidem. Kliknij przycisk Cast
i wybierz urządzenie ATV. - Na urządzeniu ATV zostanie uruchomiona aplikacja Cast Connect Codelab ATV, a przycisk Cast w aplikacji wysyłającej będzie wskazywać, że jest połączony
. - Wybierz film w aplikacji ATV, a rozpocznie się jego odtwarzanie na urządzeniu ATV.
- Na telefonie komórkowym u dołu aplikacji wysyłającej jest teraz widoczny minikontroler. Możesz użyć przycisku odtwarzania/wstrzymywania, aby sterować odtwarzaniem.
- Wybierz film na telefonie komórkowym i odtwórz go. Film zacznie się odtwarzać na ATV, a na urządzeniu mobilnym pojawi się rozszerzony kontroler.
- Zablokuj telefon, a gdy go odblokujesz, na ekranie blokady powinno pojawić się powiadomienie umożliwiające sterowanie odtwarzaniem multimediów lub zatrzymanie przesyłania.

4. Przygotowywanie projektu początkowego
Po zweryfikowaniu ukończonej integracji Cast Connect w aplikacji musimy dodać obsługę Cast Connect do pobranej aplikacji startowej. Możesz teraz rozbudowywać projekt początkowy za pomocą Androida Studio:
- Na ekranie powitalnym wybierz Importuj projekt lub kliknij Plik > Nowy > Importuj projekt….
- Wybierz katalog

app-startz folderu z przykładowym kodem i kliknij OK. - Kliknij Plik >
Synchronizuj projekt z plikami Gradle. - Wybierz urządzenie ATV i kliknij przycisk
Uruchom, aby uruchomić aplikację i przetestować interfejs. 

Projektowanie aplikacji
Aplikacja wyświetla listę filmów, które użytkownik może przeglądać. Użytkownicy mogą wybrać film do odtworzenia na Androidzie TV. Aplikacja składa się z 2 głównych działań: MainActivity i PlaybackActivity.
MainActivity
Ta aktywność zawiera fragment (MainFragment). Lista filmów i powiązanych z nimi metadanych jest skonfigurowana w klasie MovieList, a metoda setupMovies() jest wywoływana w celu utworzenia listy obiektów Movie.
Obiekt Movie reprezentuje element wideo z tytułem, opisem, miniaturami obrazów i adresem URL filmu. Każdy obiekt Movie jest powiązany z obiektem CardPresenter, aby wyświetlać miniaturę filmu z tytułem i studiem, i jest przekazywany do obiektu ArrayObjectAdapter.
Gdy element zostanie wybrany, odpowiedni obiekt Movie zostanie przekazany do PlaybackActivity.
PlaybackActivity
Ta aktywność zawiera fragment (PlaybackVideoFragment), który zawiera VideoView z ExoPlayer, niektóre opcje sterowania multimediami i obszar tekstowy do wyświetlania opisu wybranego filmu. Umożliwia też użytkownikowi odtwarzanie filmu na Androidzie TV. Użytkownik może używać pilota do odtwarzania i wstrzymywania filmów oraz przewijania ich.
Wymagania wstępne Cast Connect
Cast Connect korzysta z nowych wersji Usług Google Play, które wymagają, aby aplikacja na ATV została zaktualizowana w celu używania przestrzeni nazw AndroidX.
Aby obsługiwać Cast Connect w aplikacji na Androida TV, musisz tworzyć i obsługiwać zdarzenia z sesji multimedialnej. Biblioteka Cast Connect generuje stan multimediów na podstawie stanu sesji multimediów. Sesja multimedialna jest też używana przez bibliotekę Cast Connect do sygnalizowania, kiedy otrzymała od nadawcy określone wiadomości, np. wstrzymanie.
5. Konfigurowanie obsługi Cast
Zależności
Zaktualizuj plik build.gradle aplikacji, aby uwzględnić niezbędne zależności bibliotek:
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'
}
Zsynchronizuj projekt, aby sprawdzić, czy kompilacja przebiega bez błędów.
Zdarzenie inicjujące
CastReceiverContext to pojedynczy obiekt koordynujący wszystkie interakcje Cast. Musisz zaimplementować interfejs ReceiverOptionsProvider, aby udostępnić CastReceiverOptions podczas inicjowania CastReceiverContext.
Utwórz plik CastReceiverOptionsProvider.kt i dodaj do projektu tę klasę:
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()
}
}
Następnie w tagu <application> pliku AndroidManifest.xml aplikacji określ dostawcę opcji odbiornika:
<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>
Aby połączyć się z aplikacją ATV z urządzenia wysyłającego Cast, wybierz aktywność, którą chcesz uruchomić. W tym laboratorium kodowania uruchomimy MainActivity aplikacji po rozpoczęciu sesji Cast. W pliku AndroidManifest.xml dodaj filtr intencji uruchamiania w MainActivity.
<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>
Cykl życia kontekstu odbiornika przesyłania
CastReceiverContext należy uruchamiać po uruchomieniu aplikacji, a zatrzymywać, gdy aplikacja przechodzi w tryb działania w tle.CastReceiverContext Zalecamy używanie LifecycleObserver z biblioteki androidx.lifecycle do zarządzania wywołaniami CastReceiverContext.start() i CastReceiverContext.stop().
Otwórz plik MyApplication.kt i zainicjuj kontekst przesyłania, wywołując funkcję initInstance() w metodzie onCreate aplikacji. W klasie AppLifeCycleObserver start() CastReceiverContext, gdy aplikacja jest wznawiana, i stop(), gdy jest wstrzymywana:
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()
}
}
}
Łączenie MediaSession z MediaManager
MediaManager jest właściwością pojedynczego obiektu CastReceiverContext. Zarządza stanem multimediów, obsługuje intencję wczytywania, tłumaczy wiadomości z przestrzeni nazw multimediów od nadawców na polecenia multimedialne i wysyła stan multimediów z powrotem do nadawców.
Podczas tworzenia MediaSession musisz też podać bieżący MediaSession token do MediaManager, aby wiedział, gdzie wysyłać polecenia i pobierać stan odtwarzania multimediów. W pliku PlaybackVideoFragment.kt sprawdź, czy zmienna MediaSession została zainicjowana przed ustawieniem tokena na MediaManager.
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())
}
}
}
}
Gdy zwalniasz MediaSession z powodu braku aktywności podczas odtwarzania, ustaw token zerowy w MediaManager:
private fun releasePlayer() {
mMediaSession?.release()
castReceiverContext?.mediaManager?.setSessionCompatToken(null)
...
}
Uruchamianie przykładowej aplikacji
Kliknij przycisk
Uruchom, aby wdrożyć aplikację na urządzeniu ATV, zamknąć aplikację i wrócić do ekranu głównego ATV. Na urządzeniu nadawcy kliknij przycisk Cast
i wybierz urządzenie ATV. Aplikacja ATV zostanie uruchomiona na urządzeniu ATV, a stan przycisku Cast zmieni się na połączony.
6. Wczytuję multimedia
Polecenie wczytywania jest wysyłane za pomocą intencji z nazwą pakietu zdefiniowaną w konsoli dewelopera. Aby określić aktywność docelową, która będzie odbierać tę intencję, musisz dodać do aplikacji na Androida TV ten predefiniowany filtr intencji: W pliku AndroidManifest.xml dodaj filtr intencji wczytywania do PlayerActivity:
<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>
Obsługa żądań wczytywania na Androidzie TV
Teraz, gdy aktywność jest skonfigurowana do odbierania tego zamiaru zawierającego prośbę o wczytanie, musimy go obsłużyć.
Gdy aktywność się rozpoczyna, aplikacja wywołuje metodę prywatną o nazwie processIntent. Ta metoda zawiera logikę przetwarzania przychodzących intencji. Aby obsłużyć żądanie wczytania, zmodyfikujemy tę metodę i wyślemy intencję do dalszego przetworzenia, wywołując metodę MediaManager instancji onNewIntent. Jeśli MediaManager wykryje, że intencja jest żądaniem wczytania, wyodrębni z niej obiekt MediaLoadRequestData i wywoła MediaLoadCommandCallback.onLoad(). Zmodyfikuj metodę processIntent w pliku PlaybackVideoFragment.kt, aby obsługiwać intencję zawierającą żądanie wczytania:
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.
...
}
Następnie rozszerzymy klasę abstrakcyjną MediaLoadCommandCallback, która zastąpi metodę onLoad() wywoływaną przez MediaManager. Ta metoda otrzymuje dane z żądania wczytania i konwertuje je na obiekt Movie. Po przekonwertowaniu film jest odtwarzany przez lokalny odtwarzacz. Wartość MediaManager jest następnie aktualizowana o wartość MediaLoadRequest, a wartość MediaStatus jest rozsyłana do połączonych nadawców. Utwórz zagnieżdżoną klasę prywatną o nazwie MyMediaLoadCommandCallback w pliku PlaybackVideoFragment.kt:
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
}
Po zdefiniowaniu wywołania zwrotnego musimy zarejestrować je w MediaManager. Wywołanie zwrotne musi zostać zarejestrowane przed wywołaniem funkcji MediaManager.onNewIntent(). Dodaj setMediaLoadCommandCallback po zainicjowaniu odtwarzacza:
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())
}
}
}
Uruchamianie przykładowej aplikacji
Kliknij przycisk
Uruchom, aby wdrożyć aplikację na urządzeniu ATV. Na urządzeniu nadawcy kliknij przycisk Cast
i wybierz urządzenie ATV. Aplikacja ATV zostanie uruchomiona na urządzeniu ATV. Wybierz film na urządzeniu mobilnym, a rozpocznie się jego odtwarzanie na ATV. Sprawdź, czy na telefonie, na którym masz elementy sterujące odtwarzaniem, pojawi się powiadomienie. Spróbuj użyć elementów sterujących, np. wstrzymać film na urządzeniu ATV.
7. Obsługa poleceń sterowania przesyłaniem
Obecna aplikacja obsługuje podstawowe polecenia zgodne z sesją multimedialną, takie jak odtwarzanie, wstrzymywanie i przewijanie. Niektóre polecenia sterowania Castem nie są jednak dostępne w sesji multimedialnej. Aby obsługiwać te polecenia sterujące Cast, musisz zarejestrować MediaCommandCallback.
Dodaj MyMediaCommandCallback do instancji MediaManager za pomocą setMediaCommandCallback po zainicjowaniu odtwarzacza:
private fun initializePlayer() {
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager = castReceiverContext!!.mediaManager
...
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
}
}
Utwórz klasę MyMediaCommandCallback, aby zastąpić metody, takie jak onQueueUpdate(), i obsługiwać te polecenia sterujące Cast:
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. Praca ze stanem multimediów
Modyfikowanie stanu multimediów
Cast Connect pobiera podstawowy stan multimediów z sesji multimedialnej. Aby obsługiwać funkcje zaawansowane, aplikacja na Androida TV może określać i zastępować dodatkowe właściwości stanu za pomocą obiektu MediaStatusModifier. MediaStatusModifier będzie zawsze działać w MediaSession, które zostało ustawione w CastReceiverContext.
Na przykład, aby określić setMediaCommandSupported, gdy wywoływane jest wywołanie zwrotne onLoad:
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
})
}
}
Przechwytywanie MediaStatus przed wysłaniem
Podobnie jak w przypadku MessageInterceptor w pakiecie Web Receiver SDK, możesz określić MediaStatusWriter w MediaManager, aby wprowadzić dodatkowe modyfikacje w MediaStatus, zanim zostanie on przesłany do połączonych nadawców.
Możesz na przykład ustawić dane niestandardowe w MediaStatus przed wysłaniem ich do nadawców mobilnych:
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. Gratulacje
Wiesz już, jak włączyć przesyłanie w aplikacji na Androida TV za pomocą biblioteki Cast Connect.
Więcej informacji znajdziesz w przewodniku dla programistów: /cast/docs/android_tv_receiver.