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

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

La fonctionnalité Appuyer pour lire permet aux assistants vocaux de lire et de répondre aux messages texte à la place de l'utilisateur lorsqu'il interagit avec les notifications de messages. Pour fournir cette fonctionnalité, vous pouvez intégrer un assistant vocal à CarVoiceInteractionSession.

Dans Automotive, les notifications publiées dans le Centre de notifications identifiées comme INBOX ou INBOX_IN_GROUP (par exemple, les messages SMS) incluent un bouton Lecture. L'utilisateur peut cliquer sur Lire pour demander à l'assistant vocal sélectionné de lire la notification à voix haute et, éventuellement, de répondre par commande vocale.

Notification à lire en appuyant dessus

Figure 1 : Notification "Appuyer pour lire" avec 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 pour voiture doivent s'intégrer aux interactions vocales Android existantes. Pour en savoir plus, consultez Assistant Google pour Android (à l'exception de VoiceInteractionSession). Bien que tous les éléments de l'API d'interaction vocale restent identiques à 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 expose des API que vous pouvez utiliser pour permettre aux assistants vocaux de lire à voix haute les messages texte, puis de répondre à ces messages au nom de l'utilisateur.

La principale différence entre les classes CarVoiceInteractionSession et VoiceInteractionSession est que CarVoiceInteractionSession transmet l'action dans onShow afin que l'assistant vocal puisse détecter le contexte de la requête de l'utilisateur dès que CarVoiceInteractionSession démarre une session. Les paramètres de onShow pour chaque classe sont listés dans le tableau suivant:

CarVoiceInteractionSession VoiceInteractionSession
onShow utilise ces trois paramètres :
  • args
  • showFlags
  • actions
onShow utilise ces deux paramètres :
  • args
  • showFlags

Modifications apportées dans Android 10

À partir d'Android 10, la plate-forme appelle VoiceInteractionService.onGetSupportedVoiceActions pour détecter les actions compatibles. L'assistant vocal remplace et implémente 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 la section Diagrammes de séquence.

Action Charge utile attendue Action attendue de l'interaction vocale
VOICE_ACTION_READ_NOTIFICATION Lisez les messages à voix haute à l'utilisateur, puis renvoyez l'intent "Marquer comme lu en attente" lorsque les messages ont été lus. Si vous le souhaitez, invitez l'utilisateur à répondre.
VOICE_ACTION_REPLY_NOTIFICATION Parcelable avec clé.
KEY_NOTIFICATION qui correspond à StatusBarNotification.
Nécessite android.permission.BIND_NOTIFICATION_LISTENER_SERVICE.
Demandez à l'utilisateur d'indiquer le message de réponse, saisissez le message de réponse dans le RemoteInputReply de l'intent en attente, puis déclenchez l'intent en attente.
VOICE_ACTION_HANDLE_EXCEPTION Chaîne avec clé.
KEY_EXCEPTION qui correspond à ExceptionValue (décrit 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 pouvant gérer la requête de l'utilisateur a été désactivé.
L'action attendue pour l'exception est définie dans la documentation de l'exception.

Valeurs d'exception

EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING indique à l'assistant vocal qu'il lui manque l'autorisation Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE et qu'il doit l'obtenir auprès de l'utilisateur.

Demander l'autorisation de l'écouteur de notifications

Si l'assistant vocal par défaut ne dispose pas de l'autorisation d'écouteur de notifications, FallbackAssistant de la plate-forme (si elle est activée par le constructeur automobile) peut lire le message à voix haute avant que l'assistant vocal ne soit informé pour demander l'autorisation. Pour déterminer si FallbackAssistant est activé et a lu le message, l'assistant vocal doit vérifier la 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. Cela respecte l'utilisateur qui ne souhaite pas accorder cette autorisation à l'assistant vocal et préfère que FallbackAssistant lise les messages texte à voix haute. Demander à un utilisateur une autorisation chaque fois qu'il appuie sur Lire sur une notification de message peut nuire à l'expérience utilisateur. La plate-forme n'impose pas de limites de débit pour le compte de l'assistant vocal.

Lorsque l'assistant vocal demande l'autorisation de l'écouteur de notifications, il 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 contenant des instructions pour accorder l'autorisation. Cela aide (et rappelle) à l'utilisateur d'accorder l'autorisation lorsqu'elle est plus sûre.

Utiliser StatusBarNotification

Les StatusBarNotification transmis avec les actions vocales de lecture et de réponse sont toujours dans une notification de messagerie compatible avec la voiture, comme décrit dans la section Notifier les utilisateurs des messages. Bien que certaines notifications ne comportent pas l'intent de réponse en attente, elles comportent toutes des intents de mise en attente de la marque comme lue.

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 les messages de réponse dans l'intent en attente approprié de la notification. Une fois que l'assistant vocal a lu le message, il doit déclencher l'intent "Marquer comme lu".

Respecter les conditions préalables de la fonctionnalité Lire en appuyant sur l'écran

Seul VoiceInteractionSession de l'assistant vocal par défaut est averti lorsqu'un utilisateur déclenche l'action vocale pour lire et répondre aux messages. Comme indiqué ci-dessus, cet assistant vocal par défaut doit également disposer de l'autorisation d'écouteur de notifications.

Schémas de séquence

Ces figures illustrent les flux logiques de CarVoiceInteractionSession actions:

VOICE_ACTION_READ_NOTIFICATION

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

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

VOICE_ACTION_REPLY_NOTIFICATION

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

VOICE_ACTION_HANDLE_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 le nom de l'application de messagerie à voix haute lors de la lecture du message (par exemple, "Sam de Hangouts a dit…"), créez une fonction comme celle illustrée dans l'exemple de code suivant pour vous assurer que l'assistant lit le bon nom:

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