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.
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 :
|
onShow utilise ces deux paramètres :
|
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 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; } }
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
:
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:
Figure 3. Schéma de séquence pour VOICE_ACTION_REPLY_NOTIFICATION.
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; }