1. Omówienie
Dzięki tym ćwiczeniom w Codelabs dowiesz się, jak zmodyfikować istniejącą aplikację na Androida TV, aby obsługiwała przesyłanie i komunikację z dotychczasowych aplikacji przesyłających Cast.
Co to jest Google Cast i Cast Connect?
Google Cast umożliwia użytkownikom przesyłanie treści z urządzenia mobilnego na telewizor. Typowa sesja Google Cast składa się z dwóch elementów – aplikacji nadawca i aplikacji odbiornika. Aplikacje nadawcy, np. aplikacje mobilne lub strony (np. YouTube.com), inicjują i sterują odtwarzaniem treści w aplikacji odbiornika Cast. Aplikacje odbiorników to aplikacje zgodne z językiem HTML5, które działają na urządzeniach Chromecast i Android TV.
Prawie cały stan sesji przesyłania jest zapisywany w aplikacji odbiornika. Gdy stan jest aktualizowany, na przykład w przypadku załadowania nowego elementu multimedialnego, stan multimediów jest wysyłany do wszystkich nadawców. Komunikaty te zawierają bieżący stan sesji przesyłania. Aplikacje nadawcy używają tego stanu multimediów do wyświetlania informacji o odtwarzaniu w swoim UI.
Cast Connect opiera się na tej infrastrukturze, a aplikacja na Androida TV pełni rolę odbiornika. Biblioteka Cast Connect umożliwia aplikacji na Androida TV odbieranie wiadomości i przesyłanie stanu multimediów tak, jakby to była aplikacja odbiornika.
Co utworzymy?
Po ukończeniu tego ćwiczenia w Codelabs możesz używać aplikacji przesyłających Cast, aby przesyłać filmy do aplikacji na Androida TV. Aplikacja na Androida TV może też komunikować się z aplikacjami nadawców za pomocą protokołu Cast.
Czego się nauczysz
- Jak dodać bibliotekę Cast Connect do przykładowej aplikacji ATV
- Jak połączyć się z nadawcą Cast i uruchomić aplikację ATV.
- Jak rozpocząć odtwarzanie multimediów w aplikacji ATV z aplikacji przesyłającej Cast.
- Jak przesłać stan multimediów z aplikacji ATV do aplikacji Cast
Czego potrzebujesz
- Najnowszy pakiet SDK na Androida.
- najnowsze Android Studio, Konkretnie chodzi o wersje
Chipmunk | 2021.2.1
lub nowsze. - Urządzenie z Androidem TV z włączonymi opcjami programisty i debugowaniem USB.
- Telefon z Androidem z włączonymi opcjami programisty i debugowaniem USB.
- Kabel USB do podłączenia telefonu z Androidem i urządzeń z Androidem TV do komputera programisty.
- Podstawowa wiedza na temat tworzenia aplikacji na Androida przy użyciu Kotlin.
2. Pobieranie przykładowego kodu
Możesz pobrać cały przykładowy kod na swój komputer...
i rozpakuj pobrany plik ZIP.
3. Uruchamianie przykładowej aplikacji
Najpierw zobaczmy, jak wygląda ukończona 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 jego wybraniu będzie odtwarzany na telewizorze. Dzięki aplikacji dla nadawców mobilnych użytkownik może też przesyłać filmy do aplikacji na Androida TV.
Rejestrowanie urządzeń dewelopera
Aby korzystać z funkcji Cast Connect podczas tworzenia aplikacji, musisz zarejestrować w konsoli programisty Cast numer seryjny wbudowanego Chromecasta w urządzeniu z Androidem TV. Numer seryjny znajdziesz w sekcji Ustawienia > Ustawienia urządzenia > Wbudowany Chromecast > Numer seryjny na Androidzie TV. Pamiętaj, że nie jest to numer seryjny urządzenia fizycznego i należy go uzyskać za pomocą opisanej powyżej metody.
Jeśli tego nie zrobisz, 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 uruchom urządzenie ponownie.
Zainstaluj aplikację dla nadawców na Androida
Aby przetestować wysyłanie żądań z urządzenia mobilnego, przygotowaliśmy prostą aplikację wysyłającą o nazwie Prześlij filmy jako plik mobile-sender-0629.apk
, dostępną w pliku ZIP pobranym z kodem źródłowym. Użyjemy narzędzia ADB do zainstalowania pliku APK. Jeśli masz już zainstalowaną inną wersję Cast Video, odinstaluj ją ze wszystkich profili na urządzeniu, zanim przejdziesz dalej.
- 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 programistycznym.
- Zainstaluj aplikację
mobile-sender-0629.apk
na telefonie z Androidem.
- Aplikację przesyłającą Przesyłaj filmy znajdziesz na telefonie z Androidem.
Zainstaluj aplikację na Androida TV
Instrukcje dotyczące otwierania i uruchamiania gotowej aplikacji próbnej w Android Studio:
- Wybierz Importuj projekt na ekranie powitalnym lub kliknij Plik > Nowe > Importuj projekt...
- Wybierz katalog
app-done
z folderu przykładowego kodu i kliknij OK. - Kliknij Plik > Synchronizacja projektu 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 przez ADB, urządzenie powinno pojawić się w Android Studio.
- Kliknij przycisk Uruchom. Po kilku sekundach powinna się pojawić aplikacja ATV o nazwie Cast Connect Codelab.
Zagrajmy w Cast Connect w aplikacji ATV
- Otwórz ekran główny Androida TV.
- Otwórz aplikację dla nadawców filmów Cast na telefonie z Androidem. Kliknij przycisk Cast i wybierz swoje urządzenie ATV.
- Na quadach zostanie uruchomiona aplikacja Cast Connect Codelab ATV. Przycisk Cast w nadawcy będzie wskazywać, że urządzenie jest połączone .
- Wybierz film w aplikacji ATV, a rozpocznie się jego odtwarzanie.
- Na telefonie komórkowym minikontroler jest teraz widoczny u dołu aplikacji wysyłającej. Możesz sterować odtwarzaniem za pomocą przycisku odtwarzania/wstrzymania.
- Wybierz film na telefonie komórkowym i odtwórz go. Na urządzeniu ATV rozpocznie się odtwarzanie filmu, a rozwinięty kontroler wyświetli się na nadajniku.
- Zablokuj telefon, a po jego odblokowaniu zobaczysz na ekranie blokady powiadomienie z prośbą o sterowanie odtwarzaniem multimediów lub zatrzymywanie przesyłania.
4. Przygotowywanie projektu początkowego
Zweryfikowaliśmy już integrację Cast Connect z zakończoną integracją aplikacji, więc musimy dodać obsługę Cast Connect do pobranej aplikacji startowej. Teraz możesz zacząć tworzyć projekt początkowy przy użyciu Android Studio:
- Wybierz Importuj projekt na ekranie powitalnym lub kliknij Plik > Nowe > Importuj projekt...
- Wybierz katalog
app-start
z folderu przykładowego kodu i kliknij OK. - Kliknij Plik > Synchronizacja projektu z plikami Gradle.
- Wybierz urządzenie ATV i kliknij przycisk Uruchom, aby uruchomić aplikację i poznać interfejs.
Projektowanie aplikacji
Aplikacja wyświetla listę filmów, które użytkownik może przeglądać. Użytkownicy mogą wybrać film do obejrzenia na Androidzie TV. Aplikacja składa się z 2 głównych aktywności: MainActivity
i PlaybackActivity
.
MainActivity
Ta aktywność zawiera fragment (MainFragment
). Lista filmów i powiązane z nimi metadane są konfigurowane 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 obrazu i adresem URL filmu. Każdy obiekt Movie
jest powiązany z elementem CardPresenter
, który przedstawia miniaturę filmu z tytułem i studiem, a następnie przekazywany do ArrayObjectAdapter
.
Po wybraniu elementu odpowiedni obiekt Movie
jest przekazywany do funkcji PlaybackActivity
.
PlaybackActivity
Ta aktywność zawiera fragment (PlaybackVideoFragment
), który hostuje VideoView
z elementem ExoPlayer
, niektóre elementy sterujące multimediami oraz obszar tekstowy z opisem wybranego filmu i umożliwia użytkownikowi odtworzenie filmu na Androidzie TV. Użytkownik może odtwarzać filmy, wstrzymywać i przewijać je za pomocą pilota.
Wymagania wstępne dla Cast Connect
Cast Connect korzysta z nowych wersji Usług Google Play, które wymagają aktualizacji aplikacji ATV do przestrzeni nazw AndroidX.
Aby obsługiwać Cast Connect w aplikacji na Androida TV, musisz tworzyć zdarzenia z sesji multimediów i je obsługiwać. Biblioteka Cast Connect generuje stan multimediów na podstawie stanu sesji multimediów. Sesja multimediów jest też wykorzystywana przez bibliotekę Cast Connect do sygnalizowania, że otrzymała określone wiadomości od nadawcy (np. wstrzymanie).
5. Konfigurowanie obsługi przesyłania
Zależności
Zaktualizuj plik build.gradle
aplikacji, tak aby zawierał niezbędne zależności biblioteki:
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 potwierdzić kompilacje projektu bez błędów.
Zdarzenie inicjujące
CastReceiverContext
to pojedynczy obiekt służący do koordynowania wszystkich interakcji Cast. Musisz wdrożyć interfejs ReceiverOptionsProvider
, aby przekazać CastReceiverOptions
po zainicjowaniu 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 określ dostawcę opcji odbiorcy w tagu <application>
w pliku AndroidManifest.xml
aplikacji:
<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 za pomocą nadawcy Cast, wybierz aktywność, którą chcesz uruchomić. W ramach tego ćwiczenia w programie uruchomimy MainActivity
aplikacji po rozpoczęciu sesji przesyłania. W pliku AndroidManifest.xml
dodaj filtr intencji uruchamiania w pliku 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
CastReceiverContext
należy uruchamiać po uruchomieniu aplikacji i zatrzymać CastReceiverContext
, gdy aplikacja jest przenoszona w tle. Do zarządzania wywołaniami CastReceiverContext.start()
i CastReceiverContext.stop()
zalecamy korzystanie z LifecycleObserver
z biblioteki androidx.lifecycle.
Otwórz plik MyApplication.kt
i zainicjuj kontekst przesyłania, wywołując metodę initInstance()
w metodzie onCreate
aplikacji. W klasie AppLifeCycleObserver
start()
obiekt CastReceiverContext
po wznowieniu aplikacji oraz stop()
, gdy aplikacja jest wstrzymana:
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 sesji MediaSession i MediaManager
MediaManager
jest właściwością elementu jednokrotnego CastReceiverContext
, który zarządza stanem multimediów, obsługuje intencję wczytywania, tłumaczy wiadomości z przestrzeni nazw multimediów od nadawców na polecenia multimedialne oraz wysyła stan multimediów z powrotem do nadawców.
Podczas tworzenia MediaSession
musisz też podać organizacji MediaManager
bieżący token MediaSession
, aby wiedział, dokąd wysłać polecenia i pobrać stan odtwarzania multimediów. W pliku PlaybackVideoFragment.kt
sprawdź, czy MediaSession
został zainicjowany, zanim ustawisz token 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())
}
}
}
}
Po zwolnieniu MediaSession
z powodu nieaktywnego odtwarzania ustaw dla MediaManager
token o wartości null:
private fun releasePlayer() {
mMediaSession?.release()
castReceiverContext?.mediaManager?.setSessionCompatToken(null)
...
}
Uruchom przykładową aplikację
Kliknij przycisk Uruchom, aby wdrożyć aplikację na urządzeniu ATV, zamknąć ją i powrócić do ekranu głównego. Od nadawcy kliknij przycisk Cast i wybierz swoje urządzenie ATV. Na urządzeniu ATV wyświetli się aplikacja ATV, a przycisk Cast będzie podłączony.
6. Wczytuję multimedia
Polecenie wczytywania jest wysyłane za pomocą intencji z nazwą pakietu określoną przez Ciebie w konsoli programisty. Aby określić docelową aktywność, która będzie odbierać tę intencję, musisz dodać do aplikacji na Androida TV ten wstępnie zdefiniowany filtr intencji. W pliku AndroidManifest.xml
dodaj do pliku PlayerActivity
filtr intencji wczytywania:
<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ń obciążenia na Androidzie TV
Działanie zostało skonfigurowane pod kątem odbierania tej intencji zawierającej żądanie wczytywania, więc musimy się tym zająć.
Po rozpoczęciu aktywności aplikacja wywołuje metodę prywatną o nazwie processIntent
. Ta metoda zawiera logikę przetwarzania przychodzących intencji. Aby obsłużyć żądanie obciążenia, zmodyfikujemy tę metodę i wyślemy intencję do dalszego przetworzenia, wywołując metodę onNewIntent
instancji MediaManager
. Jeśli MediaManager
wykryje, że intencja jest żądaniem wczytywania, wyodrębni z intencji obiekt MediaLoadRequestData
i wywoła metodę MediaLoadCommandCallback.onLoad()
. Zmodyfikuj metodę processIntent
w pliku PlaybackVideoFragment.kt
, aby obsługiwała intencję zawierającą żądanie wczytywania:
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łaną przez funkcję MediaManager
. Ta metoda odbiera dane żądania wczytywania i konwertuje je na obiekt Movie
. Po przekonwertowaniu film będzie odtwarzany przez lokalny odtwarzacz. Pole MediaManager
jest następnie aktualizowane przy użyciu identyfikatora MediaLoadRequest
i przesyła MediaStatus
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
}
Gdy wywołanie zwrotne jest zdefiniowane, musimy zarejestrować je w MediaManager
. Wywołanie zwrotne musi zostać zarejestrowane przed wywołaniem funkcji MediaManager.onNewIntent()
. Dodaj atrybut 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())
}
}
}
Uruchom przykładową aplikację
Kliknij przycisk Uruchom, aby wdrożyć aplikację na urządzeniu ATV. Od nadawcy kliknij przycisk Cast i wybierz swoje urządzenie ATV. Aplikacja ATV zostanie uruchomiona na urządzeniach ATV. Wybierz film na urządzeniu mobilnym. Film zacznie się odtwarzać na telewizorze. Sprawdź, czy otrzymujesz powiadomienie na telefonie, na którym masz elementy sterujące odtwarzaniem. Spróbuj użyć elementów sterujących takich jak wstrzymaj. Odtwarzanie filmu na urządzeniu ATV powinno zostać wstrzymane.
7. Obsługa poleceń sterowania przesyłaniem
Bieżąca aplikacja obsługuje teraz podstawowe polecenia zgodne z sesją multimediów, takie jak odtwarzanie, wstrzymywanie i przewijanie. Niektóre polecenia sterowania przesyłaniem są jednak niedostępne w sesji multimediów. Aby obsługiwać te polecenia sterowania przesyłaniem, musisz zarejestrować urządzenie MediaCommandCallback
.
Dodaj element MyMediaCommandCallback
do instancji MediaManager
przy użyciu 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, na przykład onQueueUpdate()
w celu obsługi tych poleceń sterujących 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 multimediów. Aby obsługiwać funkcje zaawansowane, aplikacja na Androida TV może określać i zastępować dodatkowe właściwości stanu za pomocą MediaStatusModifier
. MediaStatusModifier
będzie zawsze działać w oparciu o MediaSession
, który ustawiono w CastReceiverContext
.
Aby na przykład określić setMediaCommandSupported
po wywołaniu wywołania zwrotnego 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 stanu MediaStatus przed wysłaniem na zewnątrz
Podobnie jak w przypadku MessageInterceptor
pakietu SDK odbiorcy internetowego, możesz określić MediaStatusWriter
w MediaManager
, aby wprowadzić dodatkowe zmiany w MediaStatus
, zanim zostanie on wysłany do połączonych nadawców.
Na przykład przed wysłaniem wiadomości do nadawców korzystających z urządzeń mobilnych możesz ustawić dane niestandardowe w MediaStatus
:
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 na potrzeby aplikacji na Androida TV, korzystając z biblioteki Cast Connect.
Więcej informacji znajdziesz w przewodniku dla programistów: /cast/docs/android_tv_receiver.