Implementacja sterowania zdalnego

Implementacja sterowania radiem opiera się na interfejsach MediaSession i MediaBrowse, które umożliwiają aplikacjom do obsługi multimediów i asystenta głosowego sterowanie radiem. Więcej informacji znajdziesz na stronie Tworzenie aplikacji multimedialnych na samochody na stronie developer.android.com.

Implementacja drzewa przeglądania multimediów jest dostępna w bibliotece car-broadcastradio-support w packages/apps/Car/libs. Biblioteka zawiera też rozszerzenia klasy ProgramSelector do konwertowania do i z identyfikatorów URI. Zalecamy, aby implementacje radia używały tej biblioteki do tworzenia powiązanego drzewa przeglądania.

Przełącznik źródeł multimediów

Aby zapewnić płynne przejście między radiem a innymi aplikacjami wyświetlanymi w multimediach, biblioteka car-media-common zawiera klasy, które należy zintegrować z aplikacją radia. MediaAppSelectorWidgetmoże być uwzględniona w pliku XML aplikacji radia (ikona i menu używane w aplikacji referencyjnej i aplikacji radia):

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

Ten widżet uruchamia panel AppSelectionFragment, w którym wyświetlana jest lista źródeł multimediów, do których można przełączyć się z obecnego źródła. Jeśli chcesz użyć innego interfejsu, możesz utworzyć niestandardowy widget, aby uruchomić AppSelectionFragment, gdy ma się wyświetlić przełącznik.

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

Przykładowa implementacja znajduje się w przykładowej aplikacji radiowej, która znajduje się w packages/apps/Car/Radio.

Szczegółowe specyfikacje

Interfejs MediaSession (poprzez MediaSession.Callback) udostępnia mechanizmy sterowania aktualnie odtwarzanym programem radiowym:

  • onPlay, onStop. (wy)ciszanie odtwarzania radia.
  • onPause. Pauza z przesunięciem czasowym (jeśli jest obsługiwana).
  • onPlayFromMediaId. Odtwarzaj dowolne treści z folderu najwyższego poziomu. Na przykład „Odtwórz FM” lub „Odtwórz radio”.
  • onPlayFromUri. Odtwarzanie określonej częstotliwości. Na przykład „Odtwórz 88,5 FM”.
  • onSkipToNext, onSkipToPrevious. Przełącz się na następną lub poprzednią stację.
  • onSetRating. Dodawanie i usuwanie z ulubionych.

MediaBrowser udostępnia możliwość dostosowania MediaItem do trzech typów katalogów najwyższego poziomu:

  • (opcjonalnie) Programy (stacje). Ten tryb jest zwykle używany przez radio z podwójnym tunerem do wskazywania wszystkich dostępnych stacji radiowych w lokalizacji użytkownika.
  • Ulubione. programy radiowe dodane do listy Ulubione, z których niektóre mogą być niedostępne (poza zasięgiem odbioru);
  • Kanały pasma Wszystkie możliwe kanały w bieżącym regionie (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 itd.). Każdy zespół ma osobny katalog najwyższego poziomu.
Struktura drzewa MediaBrowserService
Rysunek 2. Struktura drzewa MediaBrowserService

Każdy element w każdym z tych folderów (AM/FM/Programs) jest elementem MediaItem z identyfikatorem URI, który może być użyty w MediaSession do przełączenia. Każdy folder najwyższego poziomu (AM/FM/Programy) to element MediaItem z identyfikatorem mediaId, który może być używany z MediaSession do uruchamiania odtwarzania. To zależy od producenta OEM. Na przykład „Odtwórz FM”, „Odtwórz AM” i „Odtwórz radio” to niespecyficzne zapytania dotyczące radia, które używają identyfikatora mediaId do wysłania do aplikacji radiowej OEM. To aplikacja radiowa decyduje, co odtworzyć na podstawie ogólnego zapytania i identyfikatora mediaId.

MediaSession

Ponieważ nie ma możliwości wstrzymania strumienia transmisji, działania odtwarzania, wstrzymywania i zatrzymywania nie zawsze mają zastosowanie do radia. W przypadku radia działanie „Zatrzymaj” jest powiązane z wyciszeniem strumienia, a „Odtwórz” – z odwróceniem wyciszenia.

Niektóre tunery radiowe (lub aplikacje) umożliwiają symulowanie pauzy w transmisji, przechowując treści w pamięci podręcznej i odtwarzając je później. W takich przypadkach użyj onPause.

Odtwarzanie za pomocą akcji mediaId i URI jest przeznaczone do dostrajania stacji pobranej z interfejsu MediaBrowser. mediaId to dowolny ciąg znaków udostępniany przez aplikację radiową w celu narzucenia unikalnej (aby dany identyfikator wskazywał tylko jeden element) i stabilnej (aby dany element miał ten sam identyfikator przez całą sesję) wartości, za pomocą której można zidentyfikować daną stację. Identyfikator URI będzie miał dobrze zdefiniowany schemat. Krótko mówiąc, jest to postać URI funkcji ProgramSelector. Chociaż atrybut unikalności jest zachowany, nie musi być stabilny, ale może się zmienić, gdy stacja przejdzie na inną częstotliwość.

Z założenia onPlayFromSearch nie jest używany. Wybór wyniku wyszukiwania z drzewa MediaBrowser należy do klienta (aplikacji towarzyszącej). Przeniesienie tej odpowiedzialności na aplikację radiową zwiększyłoby złożoność, wymagałoby formalnych umów dotyczących tego, jak powinny wyglądać zapytania dotyczące ciągów znaków, i spowodowałoby nierówne wrażenia użytkowników na różnych platformach sprzętowych.

Uwaga: aplikacja radiowa nie zawiera dodatkowych informacji, które byłyby przydatne do wyszukiwania nazwy stacji niewyświetlanej klientowi w interfejsie MediaBrowser.

Przechodzenie do następnej lub poprzedniej stacji zależy od bieżącego kontekstu:

  • Gdy aplikacja odtwarza stację z listy Ulubionych, może przejść do następnej stacji z tej listy.
  • Słuchanie stacji z listy Program może spowodować przełączenie na kolejną dostępną stację, posortowaną według numeru kanału.
  • Słuchanie dowolnego kanału może spowodować przestrojenie na następny kanał fizyczny, nawet jeśli nie ma sygnału nadawania.

Aplikacja radiowa obsługuje te działania.

Obsługa błędów

TransportControls działania (odtwarzanie, zatrzymanie i przejście do następnego) nie dają informacji o tym, czy zostały wykonane. Jedynym sposobem na wskazanie błędu jest ustawienie stanu MediaSession na STATE_ERROR z komunikatem o błędzie.

Aplikacja radiowa musi obsługiwać te działania i wykonywć je lub ustawiać stan błędu. Jeśli wykonanie polecenia odtwarzania nie jest natychmiastowe, stan odtwarzania powinien zostać zmieniony na STATE_CONNECTING (w przypadku bezpośredniego odtwarzania) lub STATE_SKIPPING_TO_PREVIOUS lub NEXT podczas wykonywania polecenia.

Klient powinien obejrzeć PlaybackState i sprawdzić, czy sesja zmieniła bieżący program na ten, który został poproszony, lub weszła w stan błędu. STATE_CONNECTING nie może przekraczać 30 sekund. Jednak bezpośrednie dostrojenie do danej częstotliwości AM/FM powinno być znacznie szybsze.

Dodawanie i usuwanie ulubionych

MediaSession obsługuje oceny, które można wykorzystać do kontrolowania ulubionych. onSetRating wywoływany z typem oceny RATING_HEART dodaje lub usuwa aktualnie odbieraną stację z listy Ulubione.

W przeciwieństwie do starszych wstępnie ustawionych wartości ten model zakłada nieuporządkowaną i nieograniczoną listę ulubionych, na której każde zapisane ulubione było przypisane do miejsca numerycznego (zazwyczaj 1–6). W rezultacie systemy oparte na wstępnie ustawionych wartościach byłyby niezgodne z funkcją onSetRating

Ograniczenie interfejsu MediaSession API polega na tym, że można dodawać i usuwać tylko stację, która jest obecnie odtwarzana. Na przykład elementy muszą być najpierw wybrane, zanim można je usunąć. Jest to ograniczenie tylko dla klienta MediaBrowser, np. aplikacji towarzyszącej. Aplikacja radiowa nie jest w taki sposób ograniczona. Ten fragment jest opcjonalny, gdy aplikacja nie obsługuje ulubionych.

MediaBrowser

Aby określić, które częstotliwości lub nazwy kanałów fizycznych (gdy strojenie na dowolny kanał jest odpowiednie dla danej technologii radiowej) są ważne w danym regionie, dla każdego pasma podawane są wszystkie prawidłowe kanały (częstotliwości). W Stanach Zjednoczonych jest to 101 kanałów FM w zakresie od 87,8 do 108,0 MHz (z odstępem 0,2 MHz) oraz 117 kanałów AM w zakresie od 530 do 1700 kHz (z odstępem 10 kHz). Radio HD używa tego samego miejsca na kanale, dlatego nie jest prezentowane osobno.

Lista obecnie dostępnych programów radiowych jest płaska, ponieważ nie pozwala na wyświetlanie schematów takich jak grupowanie według zestawu transmisji audio (DAB).

Elementy na liście Ulubione mogą nie być dostępne do dostosowania. Na przykład, jeśli dany program jest poza zasięgiem. Aplikacja radiowa może wykryć, czy można ustawić stację z wyprzedzeniem. W takim przypadku może nie oznaczyć wpisu jako odtwarzalny.

Aby zidentyfikować foldery najwyższego poziomu, stosuje się ten sam mechanizm co w przypadku Bluetootha. Oznacza to, że pakiet dodatkowych funkcji obiektu MediaDescription zawiera pole dotyczące tunera, tak jak w przypadku Bluetooth w obiekcie EXTRA_BT_FOLDER_TYPE. W przypadku radia nadawczego prowadzi to do zdefiniowania w interfejsie API publicznego tych nowych pól:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". Jedna z tych wartości:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Dostępne obecnie programy.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 Ulubione.
    • BCRADIO_FOLDER_TYPE_BAND = 3. Wszystkie kanały fizyczne w danym paśmie.

    Nie trzeba definiować żadnych pól niestandardowych metadanych dotyczących radia, ponieważ wszystkie istotne dane pasują do istniejącego schematu MediaBrowser.MediaItem:

    • Nazwa programu (RDS PS, nazwa usługi DAB). MediaDescription.getTitle.
    • Częstotliwość FM. identyfikator URI (patrz ProgramSelector) lub MediaDescription.getTitle (jeśli wpis znajduje się w folderze BROADCASTRADIO_FOLDER_TYPE_BAND).
    • Identyfikatory specyficzne dla radia (RDS PI, DAB SId). MediaDescription.getMediaUri przeanalizowany jako ProgramSelector.

    Zwykle nie trzeba pobierać częstotliwości FM dla wpisu na liście bieżącego programu lub ulubionych (ponieważ klient powinien działać na identyfikatorach mediów). Jeśli jednak zajdzie taka potrzeba (np. ze względów wyświetlania), znajdziesz go w identyfikatorze URI, gdzie można go przeanalizować jako ProgramSelector. Nie zalecamy jednak używania identyfikatora URI do wybierania elementów w bieżącej sesji. Więcej informacji znajdziesz w artykule ProgramSelector.

    Aby uniknąć problemów z wydajnością lub problemami związanymi z usługą binder, usługa MediaBrowser musi obsługiwać podział na strony:

    Uwaga: podział na strony jest domyślnie stosowany w wersji onLoadChildren() bez obsługi opcji.

    Powiązane wpisy ze wszystkich typów list (kanały, znalezione programy i ulubione) mogą mieć różne identyfikatory mediaId (to zależy od aplikacji radiowej; biblioteka obsługi będzie mieć inne identyfikatory). Adresy URI (w formie elementu ProgramSelector) różnią się w większości przypadków między znalezionymi kanałami i programami (z wyjątkiem FM bez RDS), ale są w większości takie same między znalezionymi programami a ulubionymi (z wyjątkiem sytuacji, gdy AF zostało zaktualizowane).

    Różne identyfikatory mediaId dla wpisów z różnych typów list umożliwiają wykonywanie różnych działań. Możesz przejść na listę Ulubione lub na listę Wszystkie programy w sekcji onSkipToNext, w zależności od folderu ostatnio wybranego MediaItem (patrz MediaSession).

    Działania dotyczące specjalnego dostosowania

    Lista programów umożliwia użytkownikom nastrojenie określonej stacji, ale nie pozwala na wysyłanie ogólnych żądań, takich jak „Ustaw FM”, które mogłyby spowodować ustawienie ostatnio słuchanej stacji na paśmie FM.

    Aby umożliwić takie działania, niektóre katalogi najwyższego poziomu mają ustawiony flagę FLAG_PLAYABLE (oraz FLAG_BROWSABLE w przypadku folderów).

    Działanie Dostrojenie Jak wydać
    Włącz radio Dowolny kanał radiowy startService(ACTION_PLAY_BROADCASTRADIO)

    LUB

    playFromMediaId(MediaBrowser.getRoot())
    Włącz radio dowolny kanał FM, Odtwarzanie z poziomu mediaId pasma FM.

    Wybór programu należy do aplikacji. Zwykle jest to ostatnio wybrany kanał z danej listy. Więcej informacji o ACTION_PLAY_BROADCASTRADIO znajdziesz w artykule Ogólne intencje dotyczące rozgrywki.

    Wykrywanie i łączenie z usługą

    PackageManager może bezpośrednio znaleźć MediaBrowserService obsługujący drzewo radiofonii. Aby to zrobić, wywołaj funkcję resolveService z za pomocą intencji ACTION_PLAY_BROADCASTRADIO (patrz Ogólne intencje odtwarzania) i flagi MATCH_SYSTEM_ONLY. Aby znaleźć wszystkie usługi, które dostarczają radio (może ich być więcej niż 1, na przykład AM/FM i satelita), użyj opcji queryIntentServices.

    Rozpoznana usługa obsługuje też intent android.media.browse.MediaBrowserService bind. Zostało to zweryfikowane przez GTS.

    Aby połączyć się z wybraną usługą MediaBrowserService, utwórz instancję MediaBrowser dla danego komponentu usługi i connect. Po nawiązaniu połączenia możesz uzyskać identyfikator MediaSession za pomocą funkcji getSessionToken.

    Aplikacja Radio może ograniczać pakiety klientów, które mogą się łączyć w ramach implementacji usługi onGetRoot. Aplikacja powinna zezwalać aplikacjom systemowym na łączenie się bez umieszczania ich na białej liście. Szczegółowe informacje na temat umieszczania aplikacji na białej liście znajdziesz w artykule Akceptowanie pakietu i podpisu aplikacji Asystent.

    Jeśli aplikacja związana z konkretnym źródłem (np. aplikacja radiowa) jest zainstalowana na urządzeniu bez obsługi takiego źródła, nadal będzie się reklamować jako obsługująca intencję ACTION_PLAY_BROADCASTRADIO, ale jej drzewo MediaBrowser nie będzie zawierać tagów związanych z radiem. Dlatego klient, który chce sprawdzić, czy dany zasób jest dostępny na urządzeniu, musi:

    1. Odkryj usługę radiową (wywołaj resolveService dla ACTION_PLAY_BROADCASTRADIO).
    2. Utwórz MediaBrowser i połącz się z nim.
    3. Określ obecność MediaItem z EXTRA_BCRADIO_FOLDER_TYPE dodatkowo.

    Uwaga: w większości przypadków klient musi skanować wszystkie dostępne drzewa MediaBrowser, aby wykryć wszystkie dostępne źródła dla danego urządzenia.

    nazwy zespołów,

    Lista zespołów jest reprezentowana przez zestaw katalogów najwyższego poziomu z tagiem typu folderu ustawionym na BCRADIO_FOLDER_TYPE_BAND. Tytuły MediaItem są zlokalizowanymi ciągami znaków reprezentującymi nazwy zespołów. W większości przypadków będzie to ten sam tekst, co w tłumaczeniu angielskim, ale klient nie może tego założyć.

    Aby zapewnić stabilny mechanizm wyszukiwania niektórych pasm, do folderów pasm dodano dodatkowy tag, EXTRA_BCRADIO_BAND_NAME_EN. To nieprzetłumaczona nazwa pasma. Może ona przyjmować jedną z tych wstępnie zdefiniowanych wartości:

    • AM
    • FM
    • DAB

    Jeśli zespołu nie ma na tej liście, nie należy ustawiać tagu nazwy zespołu. Jeśli jednak pasmo znajduje się na liście, musi mieć ustawiony tag. Radio HD nie wymienia osobnych pasm, ponieważ wykorzystuje te same podstawowe nośniki co AM/FM.

    Intencje związane z ogólnymi grami

    Każda aplikacja przeznaczona do odtwarzania danego źródła (np. radia lub płyty CD) musi obsługiwać ogólny intencjonalny odtwarzania, aby rozpocząć odtwarzanie treści, nawet z nieaktywnego stanu (np. po uruchomieniu). Aplikacja decyduje, jakie treści odtwarzać, ale zwykle jest to ostatnio odtwarzany program radiowy lub utwór z CD.Dla każdego źródła dźwięku zdefiniowano osobny zamiar:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA lub CD-Text
    • android.car.intent.action.PLAY_DATADISC: optyczny dysk danych, np. CD/DVD, ale nie CD-DA (może być CD w trybie mieszanym).
    • android.car.intent.action.PLAY_AUX: bez określania, z którego portu AUX
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: bez określenia urządzenia USB
    • android.car.intent.action.PLAY_LOCAL: Pamięć na multimedia (wbudowana pamięć flash)

    Intencje zostały wybrane do użycia w przypadku ogólnego polecenia odtwarzania, ponieważ rozwiązują one dwa problemy naraz: ogólne polecenie odtwarzania i wykrywanie usługi. Dodatkową zaletą takiego zamiaru byłaby możliwość wykonania takiego prostego działania bez otwierania sesji MediaBrowser.

    Wykrywanie usług jest w istocie ważniejszym problemem rozwiązywanym przez te intencje. W ten sposób procedura wykrywania usługi jest łatwa i jednoznaczna (patrz Wykrywanie i łączenie usług).

    Aby ułatwić niektóre implementacje klienta, istnieje alternatywny sposób wydawania takiego polecenia odtwarzania (które musi być również zaimplementowane przez aplikację radio): wydawanie polecenia playFromMediaId z identyfikatorem rootId węzła głównego (używanym jako identyfikator mediaId). Węzeł rdzeniowy nie jest przeznaczony do odtwarzania, ale jego identyfikator rootId to dowolny ciąg znaków, który można ustawić jako identyfikator mediaId. Klienci nie muszą jednak rozumieć tych niuansów.

    ProgramSelector

    Chociaż mediaId wystarcza do wybrania kanału z MediaBrowserService, staje się on powiązany z sesją i nie jest spójny między dostawcami. W niektórych przypadkach klient może potrzebować wskaźnika bezwzględnego (np. bezwzględnej częstotliwości), aby zachować go między sesjami i urządzeniami.

    W erze cyfrowych transmisji radiowych sama częstotliwość nie wystarczy do nastrojenia się na konkretną stację. Dlatego użyj ProgramSelector, aby przełączyć się na kanał analogowy lub cyfrowy. ProgramSelector składa się z 2 części:

    • Główny identyfikator. Unikalny i stabilny identyfikator danej stacji radiowej, który nie zmienia się, ale może nie wystarczyć do jej wybrania. Na przykład: kod PI RDS, który może być tłumaczony na znak wywoławczy w Stanach Zjednoczonych.
    • Identyfikatory dodatkowe dodatkowe identyfikatory przydatne do nastrojenia danej stacji (np. częstotliwość), w tym identyfikatory z innych technologii radiowych; Na przykład stacja DAB może mieć alternatywne analogowe nadawanie.

    Aby umożliwić ProgramSelector dopasowanie do rozwiązania opartego na MediaBrowser lub MediaSession, zdefiniuj schemat identyfikatora URI, aby go zserializować. Schemat jest zdefiniowany w ten sposób:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>

    W tym przykładzie część dotycząca dodatkowych identyfikatorów (po znaku zapytania (?)) jest opcjonalna i może zostać usunięta, aby zapewnić stabilny identyfikator do użycia jako mediaId. Przykład:

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    Część autorytatywna (czyli host) w program pozostawia pewną przestrzeń na rozszerzenie schematu w przyszłości. Ciągi znaków typu identyfikatora są dokładnie określone jako ich nazwy w definicji IdentifierType w HAL 2.x, a format wartości to liczba dziesiętna lub szesnastkowa (z przedrostkiem 0x).

    Wszystkie identyfikatory specyficzne dla dostawcy są reprezentowane przez prefiks VENDOR_. Na przykład VENDOR_0 zamiast VENDOR_START i VENDOR_1 zamiast VENDOR_START + 1. Takie identyfikatory URI są specyficzne dla sprzętu radiowego, na którym zostały wygenerowane, i nie można ich przenieść między urządzeniami różnych producentów.

    Te identyfikatory URI muszą zostać przypisane do każdego elementu multimedialnego w folderach najwyższego poziomu w folderach radia. Dodatkowo MediaSession musi obsługiwać zarówno playFromMediaId, jak i playFromUri. Identyfikator URI jest jednak przeznaczony przede wszystkim do wyodrębniania metadanych radia (np. częstotliwości FM) i trwałego przechowywania. Nie ma gwarancji, że adres URI będzie dostępny w przypadku wszystkich elementów multimedialnych (na przykład gdy główny typ identyfikatora nie jest jeszcze obsługiwany przez platformę). Z drugiej strony identyfikator multimediów zawsze działa. Nie zalecamy używania przez klientów identyfikatorów URI do wybierania elementów z bieżącej sesji MediaBrowser. Zamiast tego użyj playFromMediaId. Nie jest to jednak opcjonalne w przypadku aplikacji wyświetlającej reklamy, a brakujące identyfikatory URI są zarezerwowane dla uzasadnionych przypadków.

    W pierwotnym projekcie zamiast sekwencji :// po części schematu używano pojedynczego dwukropka. Jednak w przypadku bezwzględnych odwołań do hierarchicznych identyfikatorów URI usługa android.net.Uri nie obsługuje pierwszego z nich.

    Inne typy źródeł

    Inne źródła dźwięku można obsługiwać w podobny sposób. Na przykład wejście pomocnicze i odtwarzacz płyt CD Audio.

    Jedna aplikacja może wyświetlać treści pochodzące z różnych źródeł. W takich przypadkach zalecamy utworzenie osobnego MediaBrowserService dla każdego typu źródła. Nawet w przypadku konfiguracji z wieloma obsługiwanymi źródłami/usługami MediaBrowserServices zdecydowanie zalecamy użycie jednej sesji MediaSession w ramach jednej aplikacji.

    Płyta CD z muzyką

    Podobnie jak w przypadku płyt CD z muzyką, aplikacja obsługująca takie dyski wyświetla MediaBrowser z jednym elementem do przeglądania (lub więcej, jeśli system ma zmieniacz CD), który zawiera wszystkie utwory z danego CD. Jeśli system nie ma informacji o ścieżkach na każdym CD (na przykład gdy wszystkie dyski są włożone do kartridża naraz, a system nie odczytuje ich wszystkich), MediaItem dla całego dysku będzie tylko PLAYABLE, a nie BROWSABLE plus PLAYABLE. Jeśli w danym gnieździe nie ma dysku, element nie będzie ani PLAYABLE, ani BROWSABLE (ale każdy gniazd zawsze musi być obecny w drzewie).

     Struktura drzewa płyty CD z muzyką
    Rysunek 3. Struktura drzewa płyty CD z muzyką.

    Te wpisy byłyby oznaczone w podobny sposób jak foldery z transmisją radiową. Zawierałyby dodatkowe pola zdefiniowane w interfejsie MediaDescription API:

    • EXTRA_CD_TRACK: dla każdego MediaItem na CD audio numer ścieżki zaczynający się od 1.
    • EXTRA_CD_DISK: numer dysku oparty na 1.

    W przypadku systemu obsługującego CD-Text i zgodnego dysku element MediaItem najwyższego poziomu miałby tytuł dysku. Podobnie MediaItems dla utworów będą zawierać tytuł utworu.

    Wejście dodatkowe

    Aplikacja, która obsługuje wejście pomocnicze, udostępnia drzewo MediaBrowser z jednym wpisem (lub więcej, jeśli istnieje więcej portów) reprezentującym port AUX. Odpowiednia sesja MediaSession pobiera identyfikator mediaId i przełącza się na to źródło po otrzymaniu żądania playFromMediaId.

    Struktura drzewa AUX
    Rysunek 4. Struktura drzewa AUX.

    Każdy wpis AUX MediaItem miałby dodatkowe pole EXTRA_AUX_PORT_NAME z nieprzetłumaczoną nazwą portu bez frazy „AUX”. Na przykład „AUX 1” ma być ustawiony na „1”, „AUX front” na „front”, a „AUX” na pusty ciąg znaków. W językach innych niż angielski tag name będzie zawierał ten sam ciąg znaków w języku angielskim. Nieprawdopodobne, ponieważ w przypadku EXTRA_BCRADIO_BAND_NAME_EN wartości są definiowane przez producenta OEM i nie są ograniczone do wstępnie zdefiniowanej listy.

    Jeśli sprzęt może wykryć urządzenia podłączone do portu AUX, powinien oznaczyć MediaItem jako PLAYABLE tylko wtedy, gdy wejście jest podłączone. Sprzęt powinien nadal być wymieniony (ale nie PLAYABLE), jeśli do tego portu nie było podłączone żadne urządzenie. Jeśli sprzęt nie ma takiej możliwości, element MediaItem musi być zawsze ustawiony na PLAYABLE.

    Dodatkowe pola

    Zdefiniuj te pola:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    Klient musi sprawdzić elementy na najwyższym poziomie MediaItems pod kątem elementów z dodatkowymi polami EXTRA_CD_DISK lub EXTRA_AUX_PORT_NAME.

    Szczegółowe przykłady

    Poniższe przykłady dotyczą struktury drzewa MediaBrowser w przypadku typów źródeł, które są częścią tego projektu.

    MediaBrowserService radia nadawczego (obsługuje ACTION_PLAY_BROADCASTRADIO):

    • Stacje (możliwość przeglądania)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • Identyfikator URI BBC One (do odtworzenia):broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (do odtworzenia) URI:broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (do odtworzenia) URI:broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (do odtworzenia) URI:broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90,5 FM (można odtwarzać) – FM bez RDSURI:broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (do odtworzenia) URI:broadcastradio://program/AMFM_FREQUENCY/620
      • Identyfikator URI BBC One (do odtworzenia): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Ulubione (można przeglądać i odtwarzać)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • Identyfikator URI BBC One (do odtworzenia): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (niedostępny do odtworzenia) identyfikator URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (możliwość przeglądania i odtwarzania):EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (do odtworzenia) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (do odtworzenia) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (do odtworzenia) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (możliwość przeglądania i odtwarzania):EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87,7 FM (do odtworzenia) URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87,9 FM (do odtworzenia) URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88,1 FM (do odtworzenia) URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (można odtworzyć): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediaBrowserService (obsługuje ACTION_PLAY_AUDIOCD):

    • Płyta 1 (do odtwarzania) EXTRA_CD_DISK=1
    • Płyta 2 (możliwość przeglądania i odtwarzania) EXTRA_CD_DISK=2
      • Ścieżka 1 (można odtworzyć) EXTRA_CD_TRACK=1
      • Utwór 2 (można odtworzyć) EXTRA_CD_TRACK=2
    • Moje CD z muzyką (można przeglądać, odtwarzać) EXTRA_CD_DISK=3
      • All By Myself (playable) EXTRA_CD_TRACK=1
      • Reise, Reise (do odtworzenia) EXTRA_CD_TRACK=2
    • Pusty slot 4 (niedostępny do odtworzenia) EXTRA_CD_DISK=4

    AUX MediaBrowserService (obsługuje ACTION_PLAY_AUX):

    • AUX front (playable) EXTRA_AUX_PORT_NAME="front"
    • AUX tył (można odtworzyć) EXTRA_AUX_PORT_NAME="rear"