Fonctionnalité Tap-to-Read de l'assistant vocal

Android Automotive considère la voix comme un composant crucial des interactions sécurisées et l'un des moyens les plus sûrs pour les utilisateurs interagir avec Android Automotive OS tout en conduisant. Par conséquent, nous avons étendu API d'assistant vocal Android (y compris VoiceInteractionSession) pour permettre aux assistants vocaux d'effectuer des tâches pour les utilisateurs ce qui peut être difficile à accomplir en conduisant.

La fonctionnalité Taper pour lire permet aux assistants vocaux de lire les SMS et d'y répondre sur pour le compte de l'utilisateur, lorsque celui-ci interagit avec les notifications de message. Pour fournir cette fonctionnalité, vous pouvez intégrer un assistant vocal CarVoiceInteractionSession

Dans l'automobile, les notifications publiées dans le centre de notifications ont été identifiées en tant que INBOX ou INBOX_IN_GROUP (par exemple, les SMS) incluent un Bouton Lecture L'utilisateur peut cliquer sur Play (Lecture) pour que l'élément sélectionné l'assistant vocal lit la notification à voix haute et peut éventuellement répondre par commande vocale.

Notification Taper pour lire

Figure 1 : Notification Taper pour lire avec le bouton de lecture

Intégrer à CarVoiceInteractionSession

Les sections suivantes décrivent comment intégrer un assistant vocal à CarVoiceInteractionSession

Prendre en charge les interactions vocales

Les applications qui fournissent des services d'interaction vocale avec la voiture doivent avec les interactions vocales Android existantes. Pour en savoir plus, consultez Assistant Google pour Android. (à l'exception de VoiceInteractionSession). Bien que toutes les API d'interaction vocale restent les mêmes que ceux implémentés sur les appareils mobiles, CarVoiceInteractionSession (décrit dans Implémenter CarVoiceInteractionSession) remplace VoiceInteractionSession Pour en savoir plus, consultez les pages suivantes:

Implémenter CarVoiceInteractionSession

CarVoiceInteractionSession présente les API que vous pouvez utiliser pour permettre aux assistants vocaux de lire des SMS à voix haute, puis répondre à ces messages au nom de l'utilisateur.

La principale différence entre CarVoiceInteractionSession et VoiceInteractionSession de classes, CarVoiceInteractionSession passes dans l'action dans onShow afin que l'assistant vocal puisse détecter le contexte de la demande de l'utilisateur dès que CarVoiceInteractionSession démarre une session. Paramètres pour onShow pour chaque classe sont répertoriés dans le tableau suivant:

CarVoiceInteractionSession SessionInteraction vocale
onShow utilise les trois paramètres suivants: <ph type="x-smartling-placeholder">
    </ph>
  • args
  • showFlags
  • actions
onShow utilise les deux paramètres suivants: <ph type="x-smartling-placeholder">
    </ph>
  • args
  • showFlags
<ph type="x-smartling-placeholder">

Modifications apportées à Android 10

À partir d'Android 10, la plate-forme appelle VoiceInteractionService.onGetSupportedVoiceActions pour détecter les actions possibles. L'assistant vocal remplace et met en œuvre VoiceInteractionService.onGetSupportedVoiceActions, comme illustré dans l'exemple suivant:

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

Les actions valides sont décrites dans le tableau suivant. Pour en savoir plus sur chaque action, consultez Schémas de séquence :

Action Charge utile attendue Action d'interaction vocale attendue
VOICE_ACTION_READ_NOTIFICATION Lire les messages à voix haute à l'utilisateur, puis déclencher le bouton "Marquer comme lu en attente" l'intent une fois les messages lus. Si vous le souhaitez, vous pouvez demander à l'utilisateur pour obtenir une réponse.
VOICE_ACTION_REPLY_NOTIFICATION Parcelable avec clé.
KEY_NOTIFICATION correspondant à StatusBarNotification.
Nécessite android.permission.BIND_NOTIFICATION_LISTENER_SERVICE.
Invitez l'utilisateur à énoncer le message de réponse, saisissez le message de réponse dans l'RemoteInputReply de l'intent en attente, puis déclenchez intent en attente.
VOICE_ACTION_HANDLE_EXCEPTION Chaîne avec clé.
KEY_EXCEPTION correspondant à ExceptionValue (décrites dans la section Valeurs d'exception).
KEY_FALLBACK_ASSISTANT_ENABLED qui correspond à une valeur booléenne. Si la valeur est true, l'assistant de remplacement qui peut gérer la requête de l'utilisateur a été est désactivé.
L'action attendue pour l'exception est définie dans le de l'exception.

Valeurs des exceptions

EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING indique à l'assistant vocal qu'il ne dispose pas de l'autorisation Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE et qu'il doit obtenir cette autorisation de la part de l'utilisateur.

Demander l'autorisation d'écouteur des notifications

Si l'assistant vocal par défaut n'a pas l'écouteur de notifications l'autorisation FallbackAssistant de la plate-forme (si cette fonctionnalité est activée par le constructeur de la voiture) peut lire le message à voix haute avant que l'assistant vocal notif pour demander l’autorisation. Pour déterminer si FallbackAssistant est activé et a lu le message, l'assistant vocal doit vérifier Valeur booléenne KEY_FALLBACK_ASSISTANT_ENABLED dans la charge utile.

La plate-forme recommande à l'assistant vocal d'ajouter une logique de limitation du débit pour le nombre de fois où cette autorisation est demandée. car il respecte l'utilisateur accorder cette autorisation à l'assistant vocal et préfère FallbackAssistant pour lire des SMS à voix haute. Proposer une utilisateur pour obtenir l'autorisation chaque fois qu'il appuie sur Lecture dans une notification de message peut nuire à l'expérience utilisateur. La plate-forme n'impose pas de limites de débit. de la part de l'assistant vocal.

Lorsque vous demandez l'autorisation de l'écouteur des notifications, l'assistant vocal doit utiliser CarUxRestrictionsManager pour déterminer si l'utilisateur est à l'arrêt ou en train de conduire. Si l'utilisateur conduit, l'assistant vocal affiche une notification indiquant comment accorder l'autorisation. Procéder à cette opération aide (et rappelle) à l'utilisateur d'accorder l'autorisation lorsque c'est plus sûr.

Utiliser StatusBarNotification

StatusBarNotification transmis avec la fonction Lire et répondre les commandes vocales sont toujours envoyées dans une notification de messagerie compatible avec la voiture, comme décrit ci-dessous. dans Notifier utilisateurs de messages. Même si certaines notifications n'ont pas la réponse en attente ils ont tous des intents en attente "Marquer comme lu".

Pour simplifier les interactions avec les notifications, utilisez NotificationPayloadHandler. qui fournit des méthodes permettant d'extraire les messages de la notification et d'écrire répondre aux messages à l'intent en attente approprié de la notification. Après le l'assistant vocal lit le message, l'assistant vocal doit déclencher le clavier comme l'intent de lecture.

Respecter les conditions préalables de la fonctionnalité Tap-to-Read

Seulement VoiceInteractionSession de la voix par défaut l'assistant reçoit une notification lorsqu'un utilisateur déclenche l'action vocale pour lire et répondre aux messages. Comme mentionné ci-dessus, cet assistant vocal par défaut doit également disposer de l'autorisation d'écouteur des notifications.

Schémas séquentiels

Les figures ci-dessous illustrent les flux logiques de CarVoiceInteractionSession actions:

NOTIFICATION_LECTURE_DE_VOICE_ACTION

Figure 2. Schéma de séquence pour VOICE_ACTION_READ_NOTIFICATION.

Dans le cas de la figure 3, il est recommandé d'appliquer des limites de débit aux demandes d'autorisation:

NOTIFICATION_RÉPONSE_VOICE_ACTION

Figure 3. Schéma de séquence pour VOICE_ACTION_REPLY_NOTIFICATION.

MANUEL_VOIX_ACTION_EXCEPTION

Figure 4. Schéma de séquence pour "VOICE_ACTION_HANDLE_EXCEPTION"

Lire le nom de l'application

Si vous souhaitez que votre assistant vocal lise à voix haute le nom de l'application de chat pendant la (par exemple, "Sam de Hangouts a dit..."), créez une fonction similaire à celle présentée ici dans l'exemple de code suivant pour vous assurer que l'assistant lit le nom correct:

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