Sprachassistent Tap-to-Read

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.

Zum Lesen tippende Benachrichtigung

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">
    </ph>
  • args
  • showFlags
  • actions
onShow verwendet diese zwei Parameter: <ph type="x-smartling-placeholder">
    </ph>
  • args
  • showFlags
<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 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;
   }
}

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:

VOICE_ACTION_READ_BENACHRICHTIGUNG

Abbildung 2: Sequenzdiagramm für VOICE_ACTION_READ_NOTIFICATION.

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

VOICE_ACTION_ANTWORT_BENACHRICHTIGUNG

Abbildung 3: Sequenzdiagramm für VOICE_ACTION_REPLY_NOTIFICATION.

VOICE_ACTION_HANDLE_EXCEPTION

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