Bei Android Automotive ist Sprache eine entscheidende Komponente
Interaktionen und eine der sichersten Möglichkeiten für Nutzer,
während der Fahrt mit Android Automotive OS interagieren. Daher erweitern wir die
Android-Sprachassistenten-APIs (einschließlich VoiceInteractionSession
)
um Sprachassistenten zu aktivieren, um Aufgaben für Nutzer auszuführen
die während der Fahrt schwer zu bewerkstelligen sind.
Mit Tap-to-Read können Sprachassistenten SMS auf
im Namen des Nutzers, wenn dieser mit Nachrichtenbenachrichtigungen interagiert. Um die
könnt ihr einen Sprachassistenten
CarVoiceInteractionSession
In Automotive wurden im Benachrichtigungscenter veröffentlichte Benachrichtigungen identifiziert
als INBOX
oder INBOX_IN_GROUP
(z. B. SMS) enthalten einen
Schaltfläche Wiedergabe: Der Nutzer kann auf Wiedergeben klicken, um die Auswahl
Sprachassistent die Benachrichtigung laut vor und kann optional per Spracheingabe antworten.
Abbildung 1: Tap-to-Read-Benachrichtigung mit Wiedergabeschaltfläche.
In CarVoiceInteractionSession einbinden
In den nächsten Abschnitten wird beschrieben, wie du einen Sprachassistenten mit
CarVoiceInteractionSession
Sprachinteraktionen unterstützen
Apps, die Sprachinteraktionsdienste im Auto anbieten, müssen
in die bestehenden Android-Sprachinteraktionen integrieren. Weitere Informationen zu Google Assistant für Android
(mit Ausnahme von VoiceInteractionSession
). Während alle Sprachinteraktionen
bleiben dieselben Elemente wie auf Mobilgeräten implementiert, CarVoiceInteractionSession
(wie unter CarVoiceInteractionSession implementieren beschrieben) ersetzt
VoiceInteractionSession
Weitere Informationen finden Sie auf den folgenden Seiten:
CarVoiceInteractionSession implementieren
CarVoiceInteractionSession
stellt APIs bereit, mit denen Sprachassistenten SMS vorlesen können.
im Namen des Nutzers auf diese Nachrichten zu antworten.
Der Hauptunterschied zwischen CarVoiceInteractionSession
und
Mit VoiceInteractionSession
Klassen kann ich
CarVoiceInteractionSession
hat die Aktion in onShow
bestanden
damit der Sprachassistent den Kontext der Anfrage des Nutzers erkennt, sobald
CarVoiceInteractionSession
startet eine Sitzung. Die Parameter für onShow
für jede Klasse sind in der folgenden Tabelle aufgeführt:
AutoVoice-Interaktionssitzung | Sprachinteraktionssitzung |
---|---|
onShow verwendet diese drei Parameter:
<ph type="x-smartling-placeholder">
|
onShow verwendet diese zwei Parameter:
<ph type="x-smartling-placeholder">
|
Änderungen bei Android 10
Ab Android 10 ruft die Plattform VoiceInteractionService.onGetSupportedVoiceActions
auf.
um zu ermitteln, welche Aktionen unterstützt werden. Der Sprachassistent überschreibt und
implementiert VoiceInteractionService.onGetSupportedVoiceActions
,
Dies wird im folgenden Beispiel gezeigt:
public class MyInteractionService extends VoiceInteractionService { private static final ListSUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION); @Override public Set onGetSupportedVoiceActions(@NonNull Set voiceActions) { Set result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } }
Die gültigen Aktionen sind in der folgenden Tabelle beschrieben. Weitere Informationen zu den einzelnen Aktionen finden Sie unter Sequenzdiagramme.
Aktion | Erwartete Nutzlast | Erwartete Aktion für Sprachinteraktion |
---|---|---|
VOICE_ACTION_READ_NOTIFICATION |
Nachrichten dem Nutzer vorlesen und dann „Als gelesen markieren ausstehend“ auslösen wenn die Nachrichten erfolgreich gelesen wurden. Optional können Sie die Funktion um eine Antwort zu erhalten. | |
VOICE_ACTION_REPLY_NOTIFICATION |
Parcelable mit Schlüssel.KEY_NOTIFICATION
die StatusBarNotification zugeordnet ist.Erfordert android.permission.BIND_NOTIFICATION_LISTENER_SERVICE . |
Fordern Sie den Nutzer auf, die Antwortnachricht anzugeben und die Antwortnachricht in
den RemoteInputReply des ausstehenden Intents und lösen Sie dann den
ausstehender Intent. |
VOICE_ACTION_HANDLE_EXCEPTION |
String mit Schlüssel.KEY_EXCEPTION
die ExceptionValue zugeordnet ist
(siehe Ausnahmewerte).KEY_FALLBACK_ASSISTANT_ENABLED , der einem booleschen Wert zugeordnet ist. Wenn der Wert
true ist, wurde der Fallback-Assistent, der die Nutzeranfrage verarbeiten kann,
deaktiviert. |
Die erwartete Aktion, die für die Ausnahme ausgeführt werden soll, ist in der Dokumentation für die Ausnahme. |
Ausnahmewerte
EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
zeigt dem Sprachassistenten an, dass ihm die Berechtigung Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
fehlt und er diese vom Nutzer einholen soll.
Berechtigung für Benachrichtigungs-Listener anfordern
Wenn der Standard-Sprachassistent keinen Benachrichtigungs-Listener hat
die FallbackAssistant
der Plattform,
(sofern vom Fahrzeughersteller aktiviert) die Nachricht möglicherweise vorliest, bevor der Sprachassistent
um die Berechtigung anzufordern. Um festzustellen, ob FallbackAssistant
aktiviert ist und
die Nachricht gelesen hat, sollte der Sprachassistent
Boolescher Wert KEY_FALLBACK_ASSISTANT_ENABLED
in der Nutzlast.
Die Plattform empfiehlt, den Sprachassistenten
die Ratenbegrenzungslogik für
wie oft diese Berechtigung angefordert wird. Dadurch werden die Nutzenden respektiert,
möchte dem Sprachassistenten diese Berechtigung erteilen und bevorzugt die
FallbackAssistant
, um SMS vorzulesen. Durch Eingabe eines
jedes Mal, wenn der Nutzer bei einer Benachrichtigung auf Wiedergeben drückt, um die Berechtigung zu erhalten
kann eine negative User Experience sein. Die Plattform gibt keine Ratenbegrenzungen vor.
im Namen des Sprachassistenten.
Wenn der Sprachassistent die Berechtigung für den Benachrichtigungs-Listener anfordert,
Verwenden Sie CarUxRestrictionsManager
, um zu ermitteln, ob ein Nutzer geparkt ist oder gerade mit dem Auto fährt. Wenn der Nutzer Auto fährt, kann der Sprachassistent
zeigt eine Benachrichtigung mit einer Anleitung zum Erteilen der Berechtigung an. Vorgehensweise
hilft (und erinnert den Nutzer daran), die Berechtigung zu erteilen, wenn dies sicherer ist.
Mit StatusBarNotification arbeiten
StatusBarNotification
wurde beim Lesen und Antworten übergeben.
Die Sprachbedienung erfolgt immer in einer Benachrichtigung, die mit dem Auto kompatibel ist, wie beschrieben.
in Benachrichtigen
Nachrichtennutzer. Auch wenn bei einigen Benachrichtigungen der Status „Antwort ausstehend“ nicht angezeigt wird
Intents haben sie alle die Option "Als gelesen markieren"
ausstehende Intents.
Sie können NotificationPayloadHandler
verwenden, um Interaktionen mit Benachrichtigungen zu optimieren.
die Methoden zum Extrahieren von Nachrichten aus der Benachrichtigung und zum Schreiben des
Nachrichten an den entsprechenden ausstehenden Intent der Benachrichtigung beantworten. Nach dem
der Sprachassistent die Nachricht liest, muss der Sprachassistent das Zeichen
als Read-Intent.
Bedingungen für Tap-to-Read erfüllen
Nur VoiceInteractionSession
der Standardstimme
wird Assistant benachrichtigt, wenn ein Nutzer die Sprachbedienung zum Lesen und Lesen auslöst.
auf Nachrichten zu antworten. Wie bereits erwähnt, muss auch dieser Standard-Sprachassistent
die Berechtigung zum Listener für Benachrichtigungen haben.
Sequenzdiagramme
Diese Abbildungen zeigen die logischen Abläufe von CarVoiceInteractionSession actions
:
Abbildung 2: Sequenzdiagramm für VOICE_ACTION_READ_NOTIFICATION.
In Abbildung 3 wird die Anwendung von Ratenbegrenzungen für Berechtigungsanfragen empfohlen:
Abbildung 3: Sequenzdiagramm für VOICE_ACTION_REPLY_NOTIFICATION.
Abbildung 4: Sequenzdiagramm für VOICE_ACTION_HANDLE_EXCEPTION.
Name der App lesen
Wenn du möchtest, dass dein Sprachassistent den Namen der Messaging-App vorliest, während Nachrichten vorlesen lassen (z. B. „Sam aus Hangouts hat gesagt...“), erstellen Sie eine Funktion wie die hier gezeigte. im folgenden Codebeispiel, damit Assistant den richtigen Namen liest:
@Nullable String getMessageApplicationName(Context context, StatusBarNotification statusBarNotification) { ApplicationInfo info = getApplicationInfo(context, statusBarNotification.getPackageName()); if (info == null) return null; Notification notification = statusBarNotification.getNotification(); // Sometimes system packages will post on behalf of other apps, so check this // field for a system app notification. if (isSystemApp(info) && notification.extras.containsKey(Notification.EXTRA_SUBSTITUTE_APP_NAME)) { return notification.extras.getString(Notification.EXTRA_SUBSTITUTE_APP_NAME); } else { PackageManager pm = context.getPackageManager(); return String.valueOf(pm.getApplicationLabel(info)); } } @Nullable ApplicationInfo getApplicationInfo(Context context, String packageName) { final PackageManager pm = context.getPackageManager(); ApplicationInfo info; try { info = pm.getApplicationInfo(packageName, 0); } catch (PackageManager.NameNotFoundException e) { return null; } return info; } boolean isSystemApp(ApplicationInfo info) { return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; }