Android Automotive betrachtet Sprache als eine entscheidende Komponente für fahrsichere Interaktionen und als eine der sichersten Möglichkeiten für Benutzer, während der Fahrt mit dem Android Automotive-Betriebssystem zu interagieren. Aus diesem Grund haben wir die Android-Sprachassistenten-APIs (einschließlich VoiceInteractionSession
) erweitert, um es Sprachassistenten zu ermöglichen, Aufgaben für Benutzer auszuführen, die während der Fahrt möglicherweise nur schwer zu erledigen sind.
Mit Tap-to-Read können Sprachassistenten Textnachrichten im Namen des Benutzers lesen und beantworten, wenn der Benutzer mit Nachrichtenbenachrichtigungen interagiert. Um diese Funktionalität bereitzustellen, können Sie einen Sprachassistenten in CarVoiceInteractionSession
integrieren.
In Automotive enthalten Benachrichtigungen, die an das Benachrichtigungscenter gesendet werden und als INBOX
oder INBOX_IN_GROUP
gekennzeichnet sind (z. B. SMS-Nachrichten), eine Wiedergabeschaltfläche . Der Benutzer kann auf „Wiedergabe“ klicken, damit der ausgewählte Sprachassistent die Benachrichtigung vorliest und optional per Spracheingabe antwortet.
Abbildung 1. Tap-to-Read-Benachrichtigung mit Play-Taste.
Integrieren Sie mit CarVoiceInteractionSession
In den nächsten Abschnitten wird beschrieben, wie Sie einen Sprachassistenten mit CarVoiceInteractionSession
integrieren.
Unterstützen Sie Sprachinteraktionen
Apps, die Sprachinteraktionsdienste im Auto bereitstellen, müssen in die vorhandenen Android-Sprachinteraktionen integriert werden. Weitere Informationen finden Sie unter Google Assistant für Android (mit Ausnahme von VoiceInteractionSession
). Während alle Sprachinteraktions-API-Elemente dieselben bleiben wie auf Mobilgeräten implementiert, ersetzt CarVoiceInteractionSession
(beschrieben unter Implementieren von CarVoiceInteractionSession ) VoiceInteractionSession
. Weitere Informationen finden Sie auf diesen Seiten:
Implementieren Sie CarVoiceInteractionSession
CarVoiceInteractionSession
stellt APIs bereit, mit denen Sie Sprachassistenten ermöglichen können, Textnachrichten vorzulesen und dann im Namen des Benutzers auf diese Nachrichten zu antworten.
Der Hauptunterschied zwischen den Klassen CarVoiceInteractionSession
und VoiceInteractionSession
besteht darin, dass CarVoiceInteractionSession
die Aktion in onShow
übergibt, sodass der Sprachassistent den Kontext der Benutzeranfrage erkennen kann, sobald CarVoiceInteractionSession
eine Sitzung startet. Die Parameter für onShow
für jede Klasse sind in der folgenden Tabelle aufgeführt:
CarVoiceInteractionSession | VoiceInteractionSession |
---|---|
onShow übernimmt diese drei Parameter:
| onShow übernimmt diese beiden Parameter:
|
Änderungen in Android 10
Ab Android 10 ruft die Plattform VoiceInteractionService.onGetSupportedVoiceActions
auf, um zu erkennen, welche Aktionen unterstützt werden. Der Sprachassistent überschreibt und implementiert VoiceInteractionService.onGetSupportedVoiceActions
, wie 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; } }
Gültige Aktionen werden in der folgenden Tabelle beschrieben. Einzelheiten zu den einzelnen Aktionen finden Sie unter Sequenzdiagramme .
Aktion | Erwartete Nutzlast | Erwartete Sprachinteraktionsaktion |
---|---|---|
VOICE_ACTION_READ_NOTIFICATION | Lesen Sie dem Benutzer Nachrichten vor und lösen Sie dann die Absicht „Als gelesen ausstehend markieren“ aus, wenn die Nachrichten erfolgreich gelesen wurden. Fordern Sie den Benutzer optional zu einer Antwort auf. | |
VOICE_ACTION_REPLY_NOTIFICATION | Mit Schlüssel parzellierbar.KEY_NOTIFICATION , das StatusBarNotification zugeordnet ist.Erfordert android.permission.BIND_NOTIFICATION_LISTENER_SERVICE . | Fordern Sie den Benutzer auf, die Antwortnachricht anzugeben, geben Sie die Antwortnachricht in RemoteInputReply der ausstehenden Absicht ein und lösen Sie dann die ausstehende Absicht aus. |
VOICE_ACTION_HANDLE_EXCEPTION | String mit Schlüssel.KEY_EXCEPTION , das ExceptionValue zugeordnet ist (beschrieben in Ausnahmewerte ).KEY_FALLBACK_ASSISTANT_ENABLED , das einem booleschen Wert zugeordnet ist. Wenn der Wert true ist, wurde der Fallback-Assistent, der die Anfrage des Benutzers verarbeiten kann, deaktiviert. | Die erwartete Aktion, die für die Ausnahme ausgeführt werden soll, ist in der Dokumentation der Ausnahme definiert. |
Ausnahmewerte
EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
zeigt dem Sprachassistenten an, dass ihm die Berechtigung Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
fehlt und dass er diese Berechtigung vom Benutzer erhalten soll.
Fordern Sie die Berechtigung zum Zuhören von Benachrichtigungen an
Wenn der Standard-Sprachassistent nicht über die Berechtigung zum Zuhören von Benachrichtigungen verfügt, liest der FallbackAssistant
der Plattform (sofern vom Autohersteller aktiviert) die Nachricht möglicherweise vor, bevor der Sprachassistent benachrichtigt wird, die Berechtigung anzufordern. Um festzustellen, ob FallbackAssistant
aktiviert ist und die Nachricht gelesen hat, sollte der Sprachassistent den booleschen Wert KEY_FALLBACK_ASSISTANT_ENABLED
in der Nutzlast überprüfen.
Die Plattform empfiehlt dem Sprachassistenten, eine ratenbegrenzende Logik für die Häufigkeit der Anforderung dieser Erlaubnis hinzuzufügen. Dies respektiert den Benutzer, der dem Sprachassistenten diese Berechtigung nicht erteilen möchte und es vorzieht, dass der FallbackAssistant
Textnachrichten laut vorliest. Einen Benutzer jedes Mal um Erlaubnis zu bitten, wenn er bei einer Nachrichtenbenachrichtigung auf „ Wiedergabe“ drückt, kann eine negative Benutzererfahrung sein. Die Plattform legt keine Tarifbeschränkungen für den Sprachassistenten fest.
Beim Anfordern der Benachrichtigungs-Listener-Berechtigung sollte der Sprachassistent CarUxRestrictionsManager
verwenden, um festzustellen, ob ein Benutzer geparkt ist oder fährt. Wenn der Benutzer fährt, zeigt der Sprachassistent eine Benachrichtigung mit Anweisungen zur Erteilung der Erlaubnis an. Dies hilft (und erinnert) den Benutzer daran, die Berechtigung zu einem sichereren Zeitpunkt zu erteilen.
Arbeiten Sie mit StatusBarNotification
StatusBarNotification
die mit den Sprachaktionen „Lesen“ und „Antworten“ übergeben wird, ist immer in einer fahrzeugkompatiblen Nachrichtenbenachrichtigung enthalten, wie unter „Benutzer über Nachrichten benachrichtigen“ beschrieben. Während einige Benachrichtigungen möglicherweise nicht die Absicht „Antwort ausstehend“ haben, verfügen sie alle über die Absicht „Als gelesen markieren – ausstehend“.
Um Interaktionen mit Benachrichtigungen zu optimieren, verwenden Sie NotificationPayloadHandler
, das Methoden zum Extrahieren von Nachrichten aus der Benachrichtigung und zum Schreiben der Antwortnachrichten in die entsprechende ausstehende Absicht der Benachrichtigung bereitstellt. Nachdem der Sprachassistent die Nachricht gelesen hat, muss der Sprachassistent die Absicht „Als gelesen markieren“ auslösen.
Erfüllen Sie die Tap-to-Read-Voraussetzungen
Nur VoiceInteractionSession
des Standard-Sprachassistenten wird benachrichtigt, wenn ein Benutzer die Sprachaktion auslöst, um Nachrichten zu lesen und zu beantworten. Wie oben erwähnt, muss dieser Standard-Sprachassistent auch über die Berechtigung zum Zuhören von Benachrichtigungen verfügen.
Sequenzdiagramme
Diese Abbildungen zeigen die logischen Abläufe von CarVoiceInteractionSession actions
:
Abbildung 2. Sequenzdiagramm für VOICE_ACTION_READ_NOTIFICATION.
Im Fall von 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.
Namen der App lesen
Wenn Sie möchten, dass Ihr Sprachassistent den Namen der Messaging-App beim Vorlesen der Nachricht vorliest (z. B. „Sam aus Hangouts sagte ...“), erstellen Sie eine Funktion wie die im folgenden Codebeispiel gezeigte, um sicherzustellen, dass der Assistent die Nachricht vorliest korrekter Name:
@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; }