Implementierung einer Funksteuerung

Die Implementierung der Radiosteuerung basiert auf MediaSession und MediaBrowse, mit denen Medien- und Sprachassistenten-Apps das Radio steuern können. Weitere Informationen finden Sie unter developer.android.com im Hilfeartikel Medien-Apps für Autos entwickeln.

Eine Implementierung des Medien-Suchbaums ist in der Bibliothek „car-broadcastradio-support“ in packages/apps/Car/libs verfügbar. Diese Bibliothek enthält auch Erweiterungen von ProgramSelector zum Konvertieren von und nach URIs. Für Radioimplementierungen wird empfohlen, diese Bibliothek zum Erstellen des zugehörigen Navigationsbaums zu verwenden.

Medienquellen-Umschalter

Für einen nahtlosen Übergang zwischen dem Radio und anderen in den Medien angezeigten Apps enthält die car-media-common-Bibliothek Klassen, die in die Radio-App eingebunden werden sollten. MediaAppSelectorWidget kann in die XML-Datei der Radio-App eingefügt werden (das Symbol und das Drop-down-Menü, das in den Referenzmedien- und Radio-Apps verwendet wird):

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

Dieses Widget öffnet die AppSelectionFragment, in der eine Liste der Medienquellen angezeigt wird, zu denen gewechselt werden kann. Wenn Sie eine andere Benutzeroberfläche als die bereitgestellte verwenden möchten, können Sie ein benutzerdefiniertes Widget erstellen, um AppSelectionFragment zu starten, wenn der Schalter angezeigt werden soll.

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

Eine Beispielimplementierung finden Sie in der Referenzimplementierung der Radio-App unter packages/apps/Car/Radio.

Detaillierte Steuerspezifikationen

Die Benutzeroberfläche MediaSession (bis MediaSession.Callback) bietet Steuermechanismen für das gerade abgespielte Radioprogramm:

  • onPlay, onStop. Stummschaltung der Radiowiedergabe aktivieren oder deaktivieren
  • onPause Pause bei zeitversetzter Wiedergabe (falls unterstützt)
  • onPlayFromMediaId Inhalte aus einem übergeordneten Ordner abspielen. Beispiel: „UKW-Radio abspielen“ oder „Radio abspielen“.
  • onPlayFromUri. Eine bestimmte Frequenz wiedergeben. Beispiel: „Spiel 88,5 FM ab.“
  • onSkipToNext, onSkipToPrevious. Zum nächsten oder vorherigen Sender wechseln.
  • onSetRating Zu Favoriten hinzufügen oder daraus entfernen.

Der MediaBrowser stellt ein anpassbares MediaItem über drei Arten von Verzeichnissen der obersten Ebene bereit:

  • (Optional) Programme (Sender) Dieser Modus wird in der Regel von Dual-Tuner-Radios verwendet, um alle verfügbaren Radiosender am Standort des Nutzers anzugeben.
  • Favoriten Einige der zur Favoritenliste hinzugefügten Radioprogramme sind möglicherweise nicht verfügbar, da sie sich außerhalb des Empfangsbereichs befinden.
  • Bandkanäle Alle physisch möglichen Kanäle in der aktuellen Region (87,9, 88,1, 88,3, 88,5, 88,7, 88,9, 89,1 usw.). Jedes Band hat ein eigenes Verzeichnis auf oberster Ebene.
Baumstruktur von MediaBrowserService
Abbildung 2. Baumstruktur von MediaBrowserService

Jedes Element in jedem dieser Ordner (AM/FM/Programme) ist ein MediaItem mit einem URI, der mit MediaSession zum Umschalten verwendet werden kann. Jeder Ordner der obersten Ebene (AM/FM/Programme) ist ein MediaItem mit einer mediaId, die mit MediaSession verwendet werden kann, um die Wiedergabe auszulösen. Diese Entscheidung liegt im Ermessen des OEMs. „FM abspielen“, „AM abspielen“ und „Radio abspielen“ sind beispielsweise nicht spezifische Radioabfragen, bei denen eine mediaId an die Radio-App des OEM gesendet wird. Die Radio-App entscheidet, was anhand der generischen Anfrage und der mediaId abgespielt werden soll.

MediaSession

Da es kein Konzept zum Pausieren eines Übertragungsstreams gibt, gelten die Aktionen „Wiedergabe“, „Pausieren“ und „Beenden“ nicht immer für Radio. Bei Radio ist die Aktion „Stopp“ mit dem Stummschalten des Streams verknüpft, während „Wiedergabe“ mit dem Aufheben der Stummschaltung verknüpft ist.

Einige Radiotuner (oder Apps) bieten die Möglichkeit, eine Pause des Übertragungsstreams zu simulieren, indem Inhalte im Cache gespeichert und später wiedergegeben werden. Verwenden Sie in diesen Fällen onPause.

Mit den Aktionen „Wiedergabe über mediaId“ und „URI“ soll ein Sender ausgewählt werden, der über die MediaBrowser-Benutzeroberfläche abgerufen wird. Die mediaId ist ein beliebiger String, der von der Radio-App bereitgestellt wird, um einen eindeutigen (d. h. eine bestimmte ID verweist nur auf ein Element) und stabilen (d. h. ein bestimmtes Element hat während der gesamten Sitzung dieselbe ID) Wert anzugeben, mit dem ein bestimmter Sender identifiziert werden kann. Der URI hat ein klar definiertes Schema. Kurz gesagt: eine URI-Version von „ProgramSelector“. Das Attribut „Einzigartigkeit“ bleibt dabei erhalten, muss aber nicht stabil sein. Es kann sich ändern, wenn der Sender zu einer anderen Frequenz wechselt.

onPlayFromSearch wird standardmäßig nicht verwendet. Es liegt in der Verantwortung des Clients (Companion-App), ein Suchergebnis aus dem MediaBrowser-Baum auszuwählen. Wenn diese Verantwortung auf die Radio-App übertragen würde, würde dies die Komplexität erhöhen, formelle Verträge darüber erfordern, wie Stringabfragen angezeigt werden sollen, und zu einer uneinheitlichen Nutzererfahrung auf verschiedenen Hardwareplattformen führen.

Hinweis:Die Radio-App enthält keine zusätzlichen Informationen, die für die Suche nach einem Sendernamen nützlich wären, der dem Client nicht über die MediaBrowser-Benutzeroberfläche zur Verfügung gestellt wird.

Ob Sie zur nächsten oder vorherigen Haltestelle springen, hängt vom aktuellen Kontext ab:

  • Wenn eine App auf einen Sender aus der Favoritenliste eingestellt ist, kann die App zum nächsten Sender in der Favoritenliste wechseln.
  • Wenn Sie einen Sender aus der Programmliste abspielen, wird möglicherweise der nächste verfügbare Sender nach Kanalnummer ausgewählt.
  • Wenn Sie sich einen beliebigen Kanal anhören, kann es passieren, dass der nächste physische Kanal eingestellt wird, auch wenn kein Übertragungssignal vorhanden ist.

Diese Aktionen werden von der Radio-App ausgeführt.

Fehlerbehandlung

TransportControls Aktionen wie „Wiedergabe“, „Stopp“ und „Weiter“ geben keine Rückmeldung dazu, ob die Aktion erfolgreich war oder nicht. Der einzige Weg, einen Fehler anzugeben, besteht darin, den Status von MediaSession auf STATE_ERROR mit einer Fehlermeldung festzulegen.

Die Radio-App muss diese Aktionen verarbeiten und entweder ausführen oder einen Fehlerstatus festlegen. Wenn die Ausführung des Befehls „Wiedergabe“ nicht sofort erfolgt, sollte der Wiedergabestatus während der Ausführung des Befehls in STATE_CONNECTING (bei direkter Senderauswahl) oder STATE_SKIPPING_TO_PREVIOUS oder NEXT geändert werden.

Der Kunde sollte sich PlaybackState ansehen und prüfen, ob das aktuelle Programm in der Sitzung in das angeforderte Programm geändert wurde oder in den Fehlerstatus versetzt wurde. STATE_CONNECTING darf 30 Sekunden nicht überschreiten. Die direkte Abstimmung auf eine bestimmte AM/FM-Frequenz sollte jedoch viel schneller erfolgen.

Favoriten hinzufügen und entfernen

MediaSession unterstützt Altersfreigaben, mit denen sich Favoriten steuern lassen. onSetRating wird mit einer Bewertung vom Typ RATING_HEART aufgerufen und fügt den aktuell eingestellten Sender der Favoritenliste hinzu oder entfernt ihn daraus.

Im Gegensatz zu älteren Presets geht dieses Modell von einer unsortierten und unbegrenzten Favoritenliste aus, bei der jedem gespeicherten Favoriten ein numerischer Slot zugewiesen wurde (in der Regel 1 bis 6). Daher sind voreingestellte Systeme mit der onSetRating-Funktion nicht kompatibel.

Die Einschränkung der MediaSession API besteht darin, dass nur der Sender hinzugefügt oder entfernt werden kann, der gerade eingestellt ist. So müssen Elemente beispielsweise zuerst ausgewählt werden, bevor sie entfernt werden können. Dies ist nur eine Einschränkung des MediaBrowser-Clients, z. B. einer Companion-App. Die Radio-App ist nicht ähnlich eingeschränkt. Dieser Abschnitt ist optional, wenn eine App keine Favoriten unterstützt.

MediaBrowser

Um anzugeben, welche Frequenzen oder physischen Kanalnamen für eine bestimmte Region gültig sind, werden für jedes Band alle gültigen Kanäle (Frequenzen) aufgeführt. In den USA entspricht dies 101 FM-Kanälen im Bereich von 87,8 bis 108,0 MHz (mit einem Abstand von 0,2 MHz) und 117 AM-Kanälen im Bereich von 530 bis 1700 kHz (mit einem Abstand von 10 kHz). Da HD-Radio denselben Kanalbereich verwendet, wird es nicht separat angezeigt.

Die Liste der derzeit verfügbaren Radioprogramme ist flach, d. h., es sind keine Darstellungsschemata wie die Gruppierung nach DAB-Ensemble (Direct Audio Broadcast) möglich.

Einträge in der Favoritenliste können möglicherweise nicht angepasst werden. Beispielsweise, wenn ein bestimmtes Programm nicht in den zulässigen Bereich fällt. Die Radio-App erkennt möglicherweise nicht, ob der Eintrag vorher eingestellt werden kann. In diesem Fall wird der Eintrag möglicherweise nicht als abspielbar markiert.

Zur Identifizierung von Ordnern der obersten Ebene wird derselbe Mechanismus verwendet, der auch von Bluetooth verwendet wird. Das bedeutet, dass ein Extras-Bundle des MediaDescription-Objekts ein tunerspezifisches Feld enthält, genau wie Bluetooth bei EXTRA_BT_FOLDER_TYPE. Im Fall von Rundfunkradio müssen in der öffentlichen API die folgenden neuen Felder definiert werden:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE": Einer der folgenden Werte:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. Derzeit verfügbare Programme.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 Favoriten.
    • BCRADIO_FOLDER_TYPE_BAND = 3. Alle physischen Kanäle für ein bestimmtes Band.

    Es müssen keine radiospezifischen benutzerdefinierten Metadatenfelder definiert werden, da alle relevanten Daten in das vorhandene MediaBrowser.MediaItem-Schema passen:

    • Programmname (RDS PS, DAB-Dienstname) MediaDescription.getTitle.
    • FM-Frequenz. URI (siehe ProgramSelector) oder MediaDescription.getTitle (wenn sich ein Eintrag im Ordner BROADCASTRADIO_FOLDER_TYPE_BAND befindet).
    • Radiospezifische Kennungen (RDS PI, DAB SId) MediaDescription.getMediaUri in ProgramSelector geparst.

    Normalerweise muss die FM-Frequenz für einen Eintrag im aktuellen Programm oder in der Favoritenliste nicht abgerufen werden, da der Client mit Medien-IDs arbeiten sollte. Sollte dies jedoch erforderlich sein (z. B. zu Anzeigezwecken), ist sie im URI enthalten und kann in ProgramSelector geparst werden. Wir empfehlen jedoch nicht, den URI zum Auswählen von Elementen in der aktuellen Sitzung zu verwenden. Weitere Informationen finden Sie unter ProgramSelector.

    Zur Vermeidung von Leistungs- oder Binder-bezogenen Problemen muss der MediaBrowser-Dienst die Paginierung unterstützen:

    Hinweis:Die Paginierung ist in der onLoadChildren()-Variante standardmäßig ohne Optionen implementiert.

    Zugehörige Einträge aus allen Arten von Listen (Raw-Kanäle, gefundene Programme und Favoriten) können unterschiedliche mediaIds haben. Das hängt von der Radio-App ab. In der Support-Mediathek sind sie unterschiedlich. Die URIs (in Form von ProgramSelector) unterscheiden sich in den meisten Fällen zwischen Rohkanälen und gefundenen Programmen (außer bei FM ohne RDS), sind aber in den meisten Fällen identisch zwischen gefundenen Programmen und Favoriten (außer z. B. wenn AF aktualisiert wurde).

    Durch unterschiedliche mediaIds für Einträge aus verschiedenen Listentypen können unterschiedliche Aktionen darauf ausgeführt werden. Je nachdem, in welchem Ordner die zuletzt ausgewählte MediaItem gespeichert ist, können Sie entweder die Liste „Favoriten“ oder die Liste „Alle Programme“ aufrufen (siehe MediaSession).onSkipToNext

    Aktionen für spezielle Melodien

    Über die Programmliste können Nutzer einen bestimmten Sender einstellen, aber keine allgemeinen Anfragen wie „FM-Sender suchen“ stellen, was dazu führen könnte, dass ein vor Kurzem gehörter Sender im FM-Band eingestellt wird.

    Um solche Aktionen zu unterstützen, ist für einige Verzeichnisse der obersten Ebene das Flag FLAG_PLAYABLE festgelegt (zusammen mit FLAG_BROWSABLE für Ordner).

    Aktion Toneinstellungen So stellen Sie eine Anfrage
    Radio hören Beliebiger Radiokanal startService(ACTION_PLAY_BROADCASTRADIO)

    ODER

    playFromMediaId(MediaBrowser.getRoot())
    Play FM Beliebiger FM-Kanal Wiedergabe über die mediaId des FM-Bands

    Welches Programm ausgewählt wird, liegt in der Verantwortung der App. In der Regel ist das der zuletzt eingestellte Kanal aus der Liste. Weitere Informationen zu ACTION_PLAY_BROADCASTRADIO finden Sie unter Allgemeine Wiedergabeabsichten.

    Erkennung und Dienstverbindung

    PackageManager kann den MediaBrowserService, der das Radio-Broadcast-Tree bereitstellt, direkt finden. Rufe dazu resolveService mit dem Intent ACTION_PLAY_BROADCASTRADIO (siehe Allgemeine Wiedergabeabsichten) und dem Flag MATCH_SYSTEM_ONLY auf. Wenn Sie alle Dienste finden möchten, die Radio anbieten (es kann mehr als einen geben, z. B. separate AM/FM- und Satellitendienste), verwenden Sie queryIntentServices.

    Der aufgelöste Dienst verarbeitet auch die android.media.browse.MediaBrowserService-Bindung. Dies wird mit GTS überprüft.

    Um eine Verbindung zum ausgewählten MediaBrowserService herzustellen, erstelle eine MediaBrowser-Instanz für eine bestimmte Dienstkomponente und connect. Nach der Herstellung der Verbindung kann über getSessionToken ein Handle für die MediaSession abgerufen werden.

    Die Radio-App kann Clientpakete einschränken, die eine Verbindung zu einer onGetRoot-Implementierung des Dienstes herstellen dürfen. Die App sollte System-Apps die Verbindung ohne Zulassungsliste erlauben. Weitere Informationen zur Zulassungsliste finden Sie unter Assistant-App-Paket und ‑Signatur akzeptieren.

    Wenn die quellenspezifische App (z. B. eine Radio-App) auf einem Gerät ohne solche Quellunterstützung installiert ist, wird sie weiterhin als ACTION_PLAY_BROADCASTRADIO-Intent-Handler angezeigt, ihr MediaBrowser-Baum enthält jedoch keine radiospezifischen Tags. Wenn ein Client prüfen möchte, ob eine bestimmte Quelle auf einem Gerät verfügbar ist, muss er Folgendes tun:

    1. Radiodienst suchen (resolveService für ACTION_PLAY_BROADCASTRADIO anrufen)
    2. Erstellen Sie MediaBrowser und stellen Sie dann eine Verbindung dazu her.
    3. Vorhandensein von MediaItem mit EXTRA_BCRADIO_FOLDER_TYPE extra ermitteln

    Hinweis : In den meisten Fällen muss der Client alle verfügbaren MediaBrowser-Bäume scannen, um alle verfügbaren Quellen für ein bestimmtes Gerät zu erkennen.

    Bandnamen

    Die Bandliste wird durch eine Reihe von Verzeichnissen der obersten Ebene mit dem Tag „Ordnertyp“ BCRADIO_FOLDER_TYPE_BAND dargestellt. Die Titel der MediaItem sind lokalisierte Strings, die Bandnamen darstellen. In den meisten Fällen entspricht sie der englischen Übersetzung, aber der Kunde kann sich nicht darauf verlassen.

    Um einen stabilen Mechanismus zum Nachschlagen bestimmter Bänder bereitzustellen, wird für Bandordner ein zusätzliches Tag hinzugefügt: EXTRA_BCRADIO_BAND_NAME_EN. Dies ist ein nicht lokalisierter Name der Band und kann nur einen der folgenden vordefinierten Werte haben:

    • AM
    • FM
    • DAB

    Wenn die Band nicht in dieser Liste enthalten ist, sollte das Bandnamen-Tag nicht festgelegt werden. Wenn sich die Band jedoch in der Liste befindet, muss ein Tag festgelegt sein. Bei HD-Radio werden keine separaten Bänder aufgezählt, da dasselbe zugrunde liegende Medium wie bei AM/FM verwendet wird.

    Allgemeine Wiedergabeabsicht

    Jede App, die zum Abspielen einer bestimmten Quelle (z. B. Radio oder CD) dient, muss einen allgemeinen Wiedergabe-Intent verarbeiten, um die Wiedergabe von Inhalten möglicherweise aus dem inaktiven Zustand zu starten (z. B. nach dem Starten). Die App entscheidet, welche Inhalte abgespielt werden. In der Regel ist das das zuletzt abgespielte Radioprogramm oder der zuletzt abgespielte CD-Titel. Für jede Audioquelle ist eine separate Absicht definiert:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA oder CD-Text
    • android.car.intent.action.PLAY_DATADISC: Optische Datenscheibe wie CD/DVD, aber keine CD-DA (kann eine CD im gemischten Modus sein)
    • android.car.intent.action.PLAY_AUX: Ohne Angabe des AUX-Anschlusses
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: Ohne Angabe des USB-Geräts
    • android.car.intent.action.PLAY_LOCAL: Lokaler Medienspeicher (integrierter Flash)

    Für den allgemeinen Wiedergabebefehl wurden Intents ausgewählt, da sie zwei Probleme gleichzeitig lösen: den allgemeinen Wiedergabebefehl selbst und die Diensterkennung. Ein weiterer Vorteil dieser Intent-Art wäre die Möglichkeit, eine solche einfache Aktion auszuführen, ohne eine MediaBrowser-Sitzung zu öffnen.

    Die Diensterkennung ist eigentlich das wichtigere Problem, das mit diesen Intents gelöst wird. So ist das Verfahren zur Diensterkennung einfach und eindeutig (siehe Diensterkennung und Dienstverbindung).

    Um einige Clientimplementierungen zu vereinfachen, gibt es eine alternative Möglichkeit, einen solchen Wiedergabebefehl auszugeben (der auch von der Radio-App implementiert werden muss): playFromMediaId mit der Root-ID des Stammknotens (wird als „mediaId“ verwendet) ausgeben. Der Stammknoten ist zwar nicht zur Wiedergabe vorgesehen, seine „rootId“ ist jedoch ein beliebiger String, der als „mediaId“ verwendet werden kann. Kunden müssen diese Nuance jedoch nicht verstehen.

    ProgramSelector

    mediaId reicht zwar aus, um einen Kanal aus der MediaBrowserService auszuwählen, wird aber an eine Sitzung gebunden und ist nicht zwischen den Anbietern konsistent. In einigen Fällen benötigt der Client einen absoluten Verweis (z. B. eine absolute Häufigkeit), um ihn zwischen Sitzungen und Geräten beizubehalten.

    Im Zeitalter digitaler Radioübertragungen reicht eine reine Frequenz nicht aus, um einen bestimmten Sender einzuwählen. Verwenden Sie daher ProgramSelector, um einen analogen oder digitalen Kanal zu suchen. ProgramSelector besteht aus zwei Teilen:

    • Primäre Kennung Eine eindeutige und unveränderliche Kennung für einen bestimmten Radiosender, die sich nicht ändert, aber möglicherweise nicht ausreicht, um diesen Sender einzuschalten. Beispielsweise der RDS-PI-Code, der in den USA in das Rufzeichen übersetzt werden kann.
    • Sekundäre Kennungen Zusätzliche Kennungen, die für die Einstellung auf diesen Sender nützlich sind (z. B. Frequenz), einschließlich Kennungen aus anderen Radiotechnologien. Ein DAB-Sender kann beispielsweise einen analogen Übertragungs-Fallback haben.

    Damit ProgramSelector in die MediaBrowser- oder MediaSession-basierte Lösung passt, müssen Sie ein URI-Schema zum Serialisieren definieren. Das Schema ist so definiert:

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

    In diesem Beispiel ist der Abschnitt „Secondary Identifiers“ (Sekundäre Kennungen) nach dem Fragezeichen (?) optional und kann entfernt werden, um eine stabile Kennung für die Verwendung als mediaId bereitzustellen. Beispiel:

    • 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

    Der Autorisierungsteil (auch als Host bezeichnet) von program bietet Spielraum für eine zukünftige Erweiterung des Schemas. Die Strings für den Kennungstyp werden in der HAL 2.x-Definition von IdentifierType genau als Namen angegeben. Das Wertformat ist eine Dezimal- oder Hexadezimalzahl (mit dem Präfix 0x).

    Alle anbieterspezifischen Kennungen haben das Präfix VENDOR_. Beispiel: VENDOR_0 für VENDOR_START und VENDOR_1 für VENDOR_START + 1. Solche URIs sind spezifisch für die Funkhardware, auf der sie generiert wurden, und können nicht zwischen Geräten verschiedener OEMs übertragen werden.

    Diese URIs müssen jedem MediaItem in den Radioordnern der obersten Ebene zugewiesen werden. Außerdem muss die MediaSession sowohl playFromMediaId als auch playFromUri unterstützen. Der URI ist jedoch in erster Linie für die Extraktion von Radiometadaten (z. B. FM-Frequenz) und die dauerhafte Speicherung vorgesehen. Es kann nicht garantiert werden, dass der URI für alle Medienelemente verfügbar ist, z. B. wenn der primäre ID-Typ noch nicht vom Framework unterstützt wird. Die Medien-ID funktioniert dagegen immer. Es wird nicht empfohlen, dass Clients URIs verwenden, um Elemente aus der aktuellen MediaBrowser-Sitzung auszuwählen. Verwenden Sie stattdessen playFromMediaId. Für die Auslieferungs-App ist er jedoch obligatorisch und fehlende URIs sind nur in gut begründeten Fällen zulässig.

    Im ursprünglichen Design wurde nach dem Schemateil ein einzelner Doppelpunkt anstelle der ://-Sequenz verwendet. Letztere werden jedoch von android.net.Uri für absolute hierarchische URI-Referenzen nicht unterstützt.

    Andere Quelltypen

    Andere Audioquellen können ähnlich behandelt werden. z. B. AUX-Eingang und Audio-CD-Player.

    Eine einzelne App kann mehrere Arten von Quellen bereitstellen. In solchen Fällen empfehlen wir, für jede Art von Quelle einen separaten MediaBrowserService zu erstellen. Auch bei einer Einrichtung mit mehreren bereitgestellten Quellen/MediaBrowserServices wird dringend empfohlen, innerhalb einer einzelnen App eine einzelne MediaSession zu verwenden.

    Audio-CD

    Ähnlich wie bei Audio-CDs stellt die App, die solche Laufwerke bereitstellt, MediaBrowser einen einzelnen durchsuchbaren Eintrag (oder mehrere, wenn das System einen CD-Wechsler hat) zur Verfügung, der wiederum alle Titel einer bestimmten CD enthält. Wenn das System keine Informationen zu den Titeln auf jeder CD hat (z. B. wenn alle Laufwerke gleichzeitig in ein Laufwerk eingesetzt werden und nicht alle gelesen werden), ist das MediaItem für das gesamte Laufwerk nur PLAYABLE, nicht BROWSABLE + PLAYABLE. Wenn sich in einem bestimmten Steckplatz kein Laufwerk befindet, ist das Element weder PLAYABLE noch BROWSABLE. Jeder Steckplatz muss jedoch immer im Baum vorhanden sein.

     Verzweigungsstruktur von Audio-CDs
    Abbildung 3 Verzweigungsstruktur einer Audio-CD.

    Diese Einträge werden ähnlich wie Ordner für Radiosender gekennzeichnet und enthalten zusätzliche Felder, die in der MediaDescription API definiert sind:

    • EXTRA_CD_TRACK: Für jede MediaItem auf der Audio-CD die Titelnummer, beginnend mit 1.
    • EXTRA_CD_DISK: Laufwerksnummer, beginnend mit 1.

    Bei einem CD-Text-kompatiblen System und einem kompatiblen Laufwerk hat das MediaItem der obersten Ebene den Titel des Laufwerks. Die MediaItems für Titel enthalten ebenfalls den Titel des Titels.

    AUX-Eingang

    Die App, die die Hilfseingabe bereitstellt, stellt einen MediaBrowser-Baum mit einem einzelnen Eintrag (oder mehreren, wenn mehrere Ports vorhanden sind) für den AUX-Eingang dar. Die jeweilige MediaSession nimmt ihre mediaId und wechselt nach Erhalt der playFromMediaId-Anfrage zu dieser Quelle.

    AUX-Baumstruktur
    Abbildung 4: AUX-Baumstruktur.

    Jeder AUX-MediaItem-Eintrag hat ein zusätzliches Feld EXTRA_AUX_PORT_NAME, das auf den nicht lokalisierten Namen des Anschlusses ohne den Begriff „AUX“ festgelegt ist. Beispiel: „AUX 1“ muss auf „1“, „AUX vorne“ auf „vorne“ und „AUX“ auf einen leeren String gesetzt werden. In anderen Sprachen bleibt das Tag „name“ derselbe englische String. Im Gegensatz zu EXTRA_BCRADIO_BAND_NAME_EN werden die Werte vom OEM definiert und sind nicht auf eine vordefinierte Liste beschränkt.

    Wenn die Hardware Geräte erkennt, die mit dem AUX-Port verbunden sind, sollte sie das MediaItem nur dann als PLAYABLE kennzeichnen, wenn der Eingang verbunden ist. Die Hardware sollte weiterhin aufgezählt werden (aber nicht PLAYABLE), wenn an diesen Anschluss nichts angeschlossen ist. Wenn die Hardware diese Funktion nicht unterstützt, muss das MediaItem immer auf PLAYABLE gesetzt werden.

    Zusätzliche Felder

    Definieren Sie die folgenden Felder:

    • 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"

    Der Kunde muss die MediaItems der obersten Ebene auf Elemente prüfen, für die das zusätzliche Feld EXTRA_CD_DISK oder EXTRA_AUX_PORT_NAME festgelegt ist.

    Detaillierte Beispiele

    In den folgenden Beispielen wird die MediaBrowser-Baumstruktur für Quelltypen beschrieben, die Teil dieses Designs sind.

    MediaBrowserService für Rundfunk (ACTION_PLAY_BROADCASTRADIO):

    • Sender (aufrufbar)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • URI für BBC One (abspielbar): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (abspielbar) – URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (abspielbar) – URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (abspielbar) – URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90,5 FM (abspielbar) – UKW ohne RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (abspielbar) – URI: broadcastradio://program/AMFM_FREQUENCY/620
      • URI für BBC One (abspielbar): broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favoriten (aufrufbar, abspielbar)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • URI für BBC One (abspielbar): broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • URI für BBC Two (nicht abspielbar): broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (aufrufbar, abspielbar): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (abspielbar) – URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (abspielbar) – URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (abspielbar) – URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (aufrufbar, abspielbar): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • URI für 87,7 FM (abspielbar): broadcastradio://program/AMFM_FREQUENCY/87700
      • URI für 87,9 FM (abspielbar): broadcastradio://program/AMFM_FREQUENCY/87900
      • URI für 88,1 FM (abspielbar): broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (abspielbar): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    MediaBrowserService für Audio-CDs (ACTION_PLAY_AUDIOCD):

    • Datenträger 1 (abspielbar) EXTRA_CD_DISK=1
    • Datenträger 2 (aufrufbar, abspielbar) EXTRA_CD_DISK=2
      • Titel 1 (abspielbar) EXTRA_CD_TRACK=1
      • Track 2 (abspielbar) EXTRA_CD_TRACK=2
    • Meine Musik-CD (durchsuchbar, abspielbar) EXTRA_CD_DISK=3
      • All By Myself (spielbar) EXTRA_CD_TRACK=1
      • Reise, Reise (spielbar) EXTRA_CD_TRACK=2
    • Leere Position 4 (nicht spielbar) EXTRA_CD_DISK=4

    AUX MediaBrowserService (ACTION_PLAY_AUX verarbeitet):

    • AUX-Anschluss vorne (abspielbar) EXTRA_AUX_PORT_NAME="front"
    • AUX-Eingang hinten (abspielbar) EXTRA_AUX_PORT_NAME="rear"