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.
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">
|
onShow utilise les deux paramètres suivants:
<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 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 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
:
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:
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 à 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; }