So implementieren Sie eine Voice Interaction Application (VIA):
- Erstellen Sie ein VIA-Skelett.
- (optional) Implementieren Sie einen Einrichtungs-/Anmeldevorgang.
- (optional) Implementieren Sie einen Bildschirm mit den Einstellungen.
- Deklarieren Sie die erforderlichen Berechtigungen in der Manifestdatei.
- Implementieren Sie eine Benutzeroberfläche für das Unterhaltungsfenster.
- Implementieren Sie die Spracherkennung (muss die RecognitionService API enthalten).
- Implementieren Sie die Äußerung. Optional können Sie die TextToSpeech API implementieren.
- Implementieren Sie die Ausführung von Befehlen. Weitere Informationen finden Sie unter Befehle ausführen.
In den folgenden Abschnitten wird beschrieben, wie Sie die einzelnen oben genannten Schritte ausführen.
VIA-Skelett erstellen
Manifeste
Eine App wird als App mit Sprachinteraktion erkannt, wenn Folgendes im Manifest enthalten ist:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myvoicecontrol"> ... <application ... > <service android:name=".MyInteractionService" android:label="@string/app_name" android:permission="android.permission.BIND_VOICE_INTERACTION" android:process=":interactor"> <meta-data android:name="android.voice_interaction" android:resource="@xml/interaction_service" /> <intent-filter> <action android:name= "android.service.voice.VoiceInteractionService" /> </intent-filter> </service> </application> </manifest>
In diesem Beispiel:
- VIAs müssen einen Dienst bereitstellen, der
VoiceInteractionService
erweitert, mit einem Intent-Filter für die AktionVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService")
. - Dieser Dienst muss die Berechtigung „
BIND_VOICE_INTERACTION
-Systemsignatur“ haben. - Dieser Dienst sollte eine
android.voice_interaction
-Metadatendatei enthalten, die Folgendes enthält:res/xml/interaction_service.xml
<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android" android:sessionService= "com.example.MyInteractionSessionService" android:recognitionService= "com.example.MyRecognitionService" android:settingsActivity= "com.example.MySettingsActivity" android:supportsAssist="true" android:supportsLaunchVoiceAssistFromKeyguard="true" android:supportsLocalInteraction="true" />
Weitere Informationen zu den einzelnen Feldern finden Sie unter R.styleable#VoiceInteractionService
.
Da alle visuellen Assistenten auch Spracherkennungsdienste sind, müssen Sie Folgendes in Ihr Manifest aufnehmen:
AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <application ...> ... <service android:name=".RecognitionService" ...> <intent-filter> <action android:name="android.speech.RecognitionService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.speech" android:resource="@xml/recognition_service" /> </service> </application> </manifest>
Für Dienste zur Spracherkennung sind außerdem die folgenden Metadaten erforderlich:
res/xml/recognition_service.xml
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.MyRecognizerSettingsActivity" />
VoiceInteractionService, VoiceInteractionSessionService und VoiceInteractionSession
Das folgende Diagramm zeigt den Lebenszyklus der einzelnen Entitäten:
Abbildung 1: Lebenszyklen
Wie bereits erwähnt, ist VoiceInteractionService
der Einstiegspunkt in eine VIA. Zu den Hauptaufgaben dieses Dienstes gehören:
- Initialisieren Sie alle Prozesse, die so lange ausgeführt werden sollen, wie diese VIA aktiv ist. Beispielsweise die Hotword-Erkennung.
- Berichte zu unterstützten Sprachbefehlen (siehe „Zum Lesen tippen“ mit dem Sprachassistenten)
- Sprachinteraktionssitzungen vom Sperrbildschirm aus starten
In der einfachsten Form würde eine VoiceInteractionService-Implementierung so aussehen:
public class MyVoiceInteractionService extends VoiceInteractionService { private static final List<String> SUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION ); @Override public void onReady() { super.onReady(); // TODO: Setup hotword detector } @NonNull @Override public Set<String> onGetSupportedVoiceActions( @NonNull Set<String> voiceActions) { Set<String> result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } ... }
Die Implementierung von VoiceInteractionService#onGetSupportedVoiceActions()
ist erforderlich, um „Tippen, um vorzulesen“ mit Google Assistant zu verarbeiten.
Ein VoiceInteractionSessionService wird vom System verwendet, um eine VoiceInteractionSession zu erstellen und mit ihr zu interagieren. Er hat nur eine Aufgabe: neue Sitzungen bei Bedarf zu starten.
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
Schließlich wird in einer VoiceInteractionSession der Großteil der Arbeit erledigt. Eine einzelne Sitzungs-Instanz kann für mehrere Nutzerinteraktionen wiederverwendet werden. In AAOS gibt es eine Hilfsfunktion CarVoiceInteractionSession
, die bei der Implementierung einiger der spezifischen Funktionen für die Automobilbranche hilft.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { public InteractionSession(Context context) { super(context); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); // TODO: Unhide UI and update UI state // TODO: Start processing audio input } ... }
VoiceInteractionSession
bietet eine große Auswahl an Rückrufmethoden, die in den folgenden Abschnitten erläutert werden. Eine vollständige Liste finden Sie in der Dokumentation zu VoiceInteractionSession
.
Einrichtungs-/Anmeldevorgang implementieren
Einrichtung und Anmeldung sind möglich:
- Während der Geräteeinrichtung (Einrichtungsassistent)
- Beim Wechseln des Sprachinteraktionsdienstes (Einstellungen)
- Beim ersten Start, wenn die App ausgewählt wird.
Weitere Informationen zur empfohlenen Nutzererfahrung und visuellen Anleitung finden Sie unter Vorinstallierte Assistenten: UX-Leitfaden.
Einrichtung beim Wechsel des Sprachdienstes
Es ist immer möglich, dass der Nutzer eine VIA auswählt, die nicht richtig konfiguriert ist. Das kann folgende Gründe haben:
- Der Nutzer hat den Einrichtungsassistenten vollständig oder den Schritt zur Konfiguration der Sprachinteraktion übersprungen.
- Der Nutzer hat eine andere VIA ausgewählt als die, die beim Geräte-Onboarding konfiguriert wurde.
In jedem Fall gibt es mehrere Möglichkeiten, wie eine VoiceInteractionService
den Nutzer dazu auffordern kann, die Einrichtung abzuschließen:
- Benachrichtigungserinnerung
- Automatische Sprachantwort, wenn der Nutzer versucht, sie zu verwenden.
Hinweis: Es wird dringend davon abgeraten, den Einrichtungsvorgang für Videoanrufe ohne explizite Nutzeranfrage anzuzeigen. Das bedeutet, dass VIAs keine Inhalte automatisch auf dem Infotainmentsystem anzeigen dürfen, wenn das Gerät gestartet wird oder ein Nutzerwechsel oder das Entsperren erfolgt.
Benachrichtigungserinnerung
Eine Benachrichtigungsaufforderung ist eine unaufdringliche Möglichkeit, die Notwendigkeit der Einrichtung anzuzeigen und Nutzern die Möglichkeit zu geben, zum Einrichtungsvorgang für den Assistant zu gelangen.
Abbildung 2: Benachrichtigungserinnerung
So funktioniert dieser Ablauf:
Abbildung 3: Ablauf für Benachrichtigungserinnerungen
Sprachantwort
Dies ist der einfachste Ablauf, bei dem eine Äußerung bei einem VoiceInteractionSession#onShow()
-Callback gestartet, dem Nutzer erklärt wird, was zu tun ist, und er dann gefragt wird, ob er den Einrichtungsablauf starten möchte (sofern die Einrichtung gemäß dem Status der UX-Einschränkungen zulässig ist). Wenn die Einrichtung derzeit nicht möglich ist, erläutern Sie auch diese Situation.
Ersteinrichtung
Es ist immer möglich, dass der Nutzer eine nicht ordnungsgemäß konfigurierte VIA auslöst. In solchen Fällen gilt Folgendes:
- Informiere den Nutzer mündlich über diese Situation (z. B.: „Damit alles ordnungsgemäß funktioniert, müssen Sie einige Schritte ausführen…“).
- Wenn die UX-Einschränkungs-Engine dies zulässt (siehe UX_RESTRICTIONS_NO_SETUP), frage den Nutzer, ob er die Einrichtung starten möchte, und öffne dann den Bildschirm „Einstellungen“ für die Videoaufruf-Funktion.
- Andernfalls (z. B. wenn der Nutzer fährt) sollte eine Benachrichtigung angezeigt werden, in der der Nutzer aufgefordert wird, auf die Option zu klicken, wenn es sicher ist.
Bildschirme für die Einrichtung der Sprachinteraktion erstellen
Einrichtungs- und Anmeldebildschirme sollten als normale Aktivitäten entwickelt werden. Die UX- und visuellen Richtlinien für die UI-Entwicklung finden Sie unter Vorinstallierte Assistenten: UX-Leitfaden.
Allgemeine Richtlinien:
- Nutzer sollten die Einrichtung über eine visuelle Anleitung jederzeit unterbrechen und fortsetzen können.
- Die Einrichtung sollte nicht zulässig sein, wenn die Einschränkung
UX_RESTRICTIONS_NO_SETUP
gilt. Weitere Informationen finden Sie in den Richtlinien zu Ablenkungen für Fahrer. - Die Einrichtungsbildschirme sollten dem Designsystem für jedes Fahrzeug entsprechen. Das allgemeine Bildschirmlayout, Symbole, Farben und andere Aspekte sollten mit dem Rest der Benutzeroberfläche übereinstimmen. Weitere Informationen finden Sie unter Anpassen.
Einen Bildschirm mit Einstellungen implementieren
Abbildung 4: Integration in die Einstellungen
Einstellungsbildschirme sind normale Android-Aktivitäten. Wenn sie implementiert sind, muss ihr Einstiegspunkt im res/xml/interaction_service.xml
als Teil der VIA-Manifeste deklariert werden (siehe Manifeste).
Im Bereich „Einstellungen“ können Sie die Einrichtung und Anmeldung fortsetzen (falls der Nutzer sie nicht abgeschlossen hat) oder bei Bedarf die Optionen Abmelden oder Nutzer wechseln anbieten. Ähnlich wie bei den oben beschriebenen Einrichtungsbildschirmen sollten diese Bildschirme Folgendes enthalten:
- Bieten Sie die Möglichkeit, zum vorherigen Bildschirm im Bildschirmstapel zurückzukehren (z. B. zu den Fahrzeugeinstellungen).
- während der Fahrt nicht zulässig sein. Weitere Informationen finden Sie in den Richtlinien zu Ablenkungen für Fahrer.
- Ordnen Sie jedem Fahrzeugdesignsystem die richtige Option zu. Weitere Informationen finden Sie unter Anpassung.
Erforderliche Berechtigungen in der Manifestdatei angeben
Die für eine VIA erforderlichen Berechtigungen lassen sich in drei Kategorien unterteilen:
- Berechtigungen für die Systemsignatur Diese Berechtigungen werden nur vorinstallierten, vom System signierten APKs gewährt. Nutzer können diese Berechtigungen nicht gewähren. Nur OEMs können sie beim Erstellen ihrer Systemabbilder gewähren. Weitere Informationen zum Abrufen von Berechtigungen für die Signatur finden Sie unter Systemberechtigungen gewähren.
- Gefährliche Berechtigungen Dies sind Berechtigungen, die ein Nutzer über das Dialogfeld „PermissionsController“ gewähren muss. OEMs können einige dieser Berechtigungen vorab dem Standard-VoiceInteractionService gewähren. Da sich diese Standardeinstellung jedoch von Gerät zu Gerät ändern kann, sollten Apps diese Berechtigungen bei Bedarf anfordern können.
- Weitere Berechtigungen Dies sind alle anderen Berechtigungen, für die keine Nutzereingriffe erforderlich sind. Diese Berechtigungen werden automatisch vom System gewährt.
Aus diesem Grund liegt der Schwerpunkt des folgenden Abschnitts nur auf dem Anfordern gefährlicher Berechtigungen. Berechtigungen sollten nur angefordert werden, wenn sich der Nutzer auf den Anmelde- oder Einstellungsbildschirmen befindet.
Wenn die App nicht die erforderlichen Berechtigungen hat, wird empfohlen, dem Nutzer die Situation per Sprachausgabe zu erklären und ihm mit einer Benachrichtigung zu zeigen, wie er zu den VIA-Einstellungsbildschirmen zurückkehren kann. Weitere Informationen finden Sie unter 1. Benachrichtigungserinnerung
Berechtigungen auf dem Einstellungsbildschirm anfordern
Gefährliche Berechtigungen werden mit der regulären ActivityCompat#requestPermission()
-Methode (oder einer entsprechenden Methode) angefordert. Weitere Informationen zum Anfordern von Berechtigungen finden Sie unter App-Berechtigungen anfordern.
Abbildung 5: Berechtigungen anfordern
Berechtigung für Benachrichtigungs-Listener
Zur Implementierung des TTR-Vorgangs müssen VIAs als Benachrichtigungslistener festgelegt werden. Dies ist keine Berechtigung im eigentlichen Sinne, sondern eine Konfiguration, die es dem System ermöglicht, Benachrichtigungen an registrierte Listener zu senden. Um herauszufinden, ob der VIA Zugriff auf diese Informationen gewährt wurde, können Apps Folgendes tun:
- Optional: Prüfen Sie mit
CarAssistUtils#assistantIsNotificationListener()
, ob es Benachrichtigungslisteners gibt. Das kann beispielsweise während der Einrichtung geschehen. - (Erforderlich) Hiermit wird auf die Verarbeitung der
CarVoiceInteractionSession#onShow()
mit der AktionVOICE_ACTION_HANDLE_EXCEPTION
und der AusnahmeEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
reagiert.
Wenn dieser Zugriff nicht vorab gewährt wurde, sollte die Sprachschnittstelle den Nutzer mit einer Kombination aus Äußerungen und Benachrichtigungen zum Abschnitt „Zugriff auf Benachrichtigungen“ in den Einstellungen für das Auto weiterleiten. Mit dem folgenden Code können Sie den entsprechenden Bereich der Einstellungen öffnen:
private void requestNotificationListenerAccess() { Intent intent = new Intent(Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); startActivity(intent); }
Benutzeroberfläche für Unterhaltungsfenster implementieren
Wenn ein VoiceInteractionSession
einen onShow()
-Callback erhält, kann eine Sprachfeld-Benutzeroberfläche angezeigt werden. Visuelle und UX-Richtlinien für die Implementierung von Sprachfeldern finden Sie unter Vorinstallierte Assistenten: UX-Leitfaden.
Abbildung 6 Anzeige des Sprachfelds
Es gibt zwei Möglichkeiten, diese Benutzeroberfläche zu implementieren:
VoiceInteractionSession#onCreateContentView()
überschreiben- Aktivität mit
VoiceInteractionSession#startAssistantActivity()
starten
onCreateContentView() verwenden
Dies ist die Standarddarstellung einer Sprachtafel. Die Basisklasse VoiceInteractionSession
erstellt ein Fenster und verwaltet seinen Lebenszyklus, solange eine Sprachsitzung aktiv ist. Apps müssen VoiceInteractionSession#onCreateContentView()
überschreiben und eine Ansicht zurückgeben, die an dieses Fenster angehängt ist, sobald die Sitzung erstellt wird. Diese Ansicht sollte anfangs nicht sichtbar sein. Wenn eine Sprachinteraktion beginnt, sollte diese Ansicht auf VoiceInteractionSession#onShow()
sichtbar und dann auf VoiceInteractionSession#onHide()
wieder ausgeblendet werden.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { private View mVoicePlate; … @Override public View onCreateContentView() { mVoicePlate = inflater.inflate(R.layout.voice_plate, null); … } @Override protected void onShow(String action, Bundle args, int showFlags) { // TODO: Update UI state to "listening" mVoicePlate.setVisibility(View.VISIBLE); } @Override public void onHide() { mVoicePlate.setVisibility(View.GONE); } … }
Wenn Sie diese Methode verwenden, sollten Sie VoiceInteractionSession#onComputeInsets()
anpassen, um verdeckten Bereichen Ihrer Benutzeroberfläche Rechnung zu tragen.
startAssistantActivity() verwenden
In diesem Fall delegiert VoiceInteractionSession
die Verarbeitung der Sprachfeld-UI an eine reguläre Aktivität. Wenn diese Option verwendet wird, muss eine VoiceInteractionSession
-Implementierung das Erstellen des Standardinhaltsfensters im onPrepareShow()
-Callback deaktivieren (siehe onCreateContentView() verwenden). Um VoiceInteractionSession#onShow()
startet die Sitzung die Sprachmodulaktivität mit VoiceInteractionSession#startAssistantActivity()
. Bei dieser Methode wird die Benutzeroberfläche mit den richtigen Fenstereinstellungen und Aktivitätsflags initialisiert.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { … @Override public void onPrepareShow(Bundle args, int showFlags) { super.onPrepareShow(args, showFlags); setUiEnabled(false); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); Intent intent = new Intent(getContext(), VoicePlateActivity.class); intent.putExtra(VoicePlateActivity.EXTRA_ACTION, action); intent.putExtra(VoicePlateActivity.EXTRA_ARGS, args); startAssistantActivity(intent); } … }
Um die Kommunikation zwischen dieser Aktivität und der VoiceInteractionSession
aufrechtzuerhalten, sind möglicherweise eine Reihe interner Intents oder Dienstbindungen erforderlich. Wenn beispielsweise VoiceInteractionSession#onHide()
aufgerufen wird, muss die Sitzung diese Anfrage an die Aktivität weitergeben können.
Wichtig: Im Bereich „Automobil“ können während der Fahrt nur speziell kommentierte Aktivitäten oder Aktivitäten angezeigt werden, die auf der Zulassungsliste von UXR stehen. Das gilt auch für Aktivitäten, die vor dem VoiceInteractionSession#startAssistantActivity()
begonnen wurden. Denk daran, deine Aktivität entweder mit <meta-data
android:name="distractionOptimized" android:value="true"/>
zu annotieren oder sie im Schlüssel systemActivityWhitelist
der /packages/services/Car/service/res/values/config.xml
-Datei anzugeben. Weitere Informationen finden Sie in den Richtlinien zu Ablenkungen für Fahrer.
Spracherkennung implementieren
In diesem Abschnitt erfahren Sie, wie Sie die Spracherkennung durch die Erkennung und Erkennung von Hotwords implementieren. Ein Hotword ist ein Triggerwort, mit dem eine neue Suchanfrage oder Aktion per Sprachbefehl gestartet wird. Beispiel: „Hey Google“ oder „Ok Google“.
DSP-Hotword-Erkennung
Android bietet über die AlwaysOnHotwordDetector
Zugriff auf einen dauerhaft aktivierten Hotword-Detektor auf DSP-Ebene.
Hotword-Erkennung mit niedriger CPU-Auslastung implementieren Die Nutzung dieser Funktion ist in zwei Teile unterteilt:
- Instanziierung einer
AlwaysOnHotwordDetector
. - Registrierung eines Hotword-Erkennungs-Tonmodells.
Die VoiceInteractionService-Implementierung kann mit VoiceInteractionService#createAlwaysOnHotwordDetector()
einen Hotword-Detektor erstellen und einen Keyword und ein Gebietsschema übergeben, das für die Erkennung verwendet werden soll. Die App erhält dann einen onAvailabilityChanged()
-Callback mit einem der folgenden Werte:
STATE_HARDWARE_UNAVAILABLE
. Die DSP-Funktion ist auf dem Gerät nicht verfügbar. In diesem Fall wird die Software-Hotword-Erkennung verwendet.STATE_HARDWARE_UNSUPPORTED
. Der DSP-Support ist nicht allgemein verfügbar, aber der DSP unterstützt die Kombination aus Keyword und Sprache nicht. Die App kann die Software-Hotword-Erkennung verwenden.STATE_HARDWARE_ENROLLED
. Die Hotword-Erkennung ist bereit und kann durch Aufrufen der MethodestartRecognition()
gestartet werden.STATE_HARDWARE_UNENROLLED
. Ein Audiomodell für die angeforderte Schlüsselphrase ist nicht verfügbar, aber die Registrierung ist möglich.
Die Registrierung von Audiomodellen für die Hotword-Erkennung kann mit IVoiceInteractionManagerService#updateKeyphraseSoundModel()
erfolgen.
Es können mehrere Modelle gleichzeitig im System registriert sein, aber nur ein Modell ist mit einer AlwaysOnHotwordDetector
verknüpft.
Die DSP-Hotword-Erkennung ist möglicherweise nicht auf allen Geräten verfügbar. VIA-Entwickler sollten die Hardwarefunktionen mit der getDspModuleProperties()
-Methode prüfen. Beispielcode zum Registrieren von Audiomodellen finden Sie unter VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java
.
Weitere Informationen zur gleichzeitigen Hotword-Erkennung finden Sie unter Gleichzeitige Aufnahme.
Software-Hotword-Erkennung
Wie oben erwähnt, ist die DSP-Hotword-Erkennung möglicherweise nicht auf allen Geräten verfügbar. Der Android-Emulator bietet beispielsweise keine DSP-Emulation. In diesem Fall ist die Software-Spracherkennung die einzige Alternative. Um Störungen durch andere Apps zu vermeiden, die möglicherweise Zugriff auf das Mikrofon benötigen, müssen VIAs auf die Audioeingabe zugreifen:
- Für die Audioaufnahme muss MediaRecorder.AudioSource.HOTWORD verwendet werden.
- Sie haben die Berechtigung
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD
.
Beide Konstanten sind @hide
und nur für gebündelte Apps verfügbar.
Audioeingabe und Spracherkennung verwalten
Die Audioeingabe wird mit der MediaRecorder-Klasse implementiert.
Weitere Informationen zur Verwendung dieser API finden Sie in der MediaRecorder-Übersicht. Dienste für die Sprachinteraktion sollten ebenfalls RecognitionService
-Klassenimplementierungen sein. Alle Apps im System, für die Spracherkennung erforderlich ist, verwenden die API, um auf diese Funktion zuzugreifen. Damit die Spracherkennung funktioniert und die VIAs auf das Mikrofon zugreifen können, müssen sie android.permission.RECORD_AUDIO
gedrückt halten.
Apps, die auf eine RecognitionService
-Implementierung zugreifen, sollten diese Berechtigung ebenfalls haben.
Vor Android 10 wurde der Mikrofonzugriff nur einer App gleichzeitig gewährt (mit Ausnahme der Hotword-Erkennung, siehe oben). Ab Android 10 kann der Mikrofonzugriff freigegeben werden. Weitere Informationen finden Sie unter Audioeingabe freigeben.
Zugriff auf Audioausgabe
Wenn der virtuelle Assistent bereit ist, mündliche Antworten zu geben, ist es wichtig, die folgenden Richtlinien zu beachten:
- Wenn die App den Audiofokus anfordert oder die Audioausgabe verwaltet, muss sie
AudioAttributes#USAGE_ASSISTANT
undAudioAttributes#CONTENT_TYPE_SPEECH
als Audioattribute verwenden. - Während der Spracherkennung muss der Audiofokus mit
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
angefordert werden. Einige Medien-Apps reagieren möglicherweise nicht richtig auf Medienbefehle (siehe Ausführung von Medienbefehlen), wenn der Audiofokus nicht auf ihnen liegt.