Sprachassistent Tap-to-Read

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.

Tippen Sie auf die Benachrichtigung, um sie zu lesen

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:
  • args
  • showFlags
  • actions
onShow übernimmt diese beiden Parameter:
  • args
  • showFlags

Ä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 List SUPPORTED_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 :

VOICE_ACTION_READ_NOTIFICATION

Abbildung 2. Sequenzdiagramm für VOICE_ACTION_READ_NOTIFICATION.

Im Fall von Abbildung 3 wird die Anwendung von Ratenbegrenzungen für Berechtigungsanfragen empfohlen:

VOICE_ACTION_REPLY_NOTIFICATION

Abbildung 3. Sequenzdiagramm für VOICE_ACTION_REPLY_NOTIFICATION.

VOICE_ACTION_HANDLE_EXCEPTION

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;
}