Android fournit une implémentation Bluetooth complète compatible avec de nombreux profils Bluetooth courants dans les voitures. De nombreuses améliorations ont également été apportées pour améliorer les performances et l'expérience avec d'autres appareils et services.
Gestion de la connexion Bluetooth
Dans Android, CarBluetoothService gère les appareils Bluetooth de l'utilisateur actuel et les listes de priorité pour chaque connexion de profil à l'IVI. Les appareils sont associés aux profils selon un ordre de priorité défini. L'activation, la désactivation et la connexion d'appareils à un profil sont régies par une règle de connexion par défaut qui peut être remplacée par une superposition de ressources, si vous le souhaitez.
Configurer la gestion des connexions automobiles
Désactiver la règle de téléphone par défaut
La pile Bluetooth Android maintient une règle de connexion pour les téléphones, qui est activée par défaut. Cette règle doit être désactivée sur votre appareil pour ne pas entrer en conflit avec la règle automobile prévue dans
CarBluetoothService. Bien que la superposition du produit Car devrait s'en charger pour vous, vous pouvez désactiver la règle relative au téléphone dans une
superposition de ressources en définissant enable_phone_policy
sur false
dans MAXIMUM_CONNECTED_DEVICES
dans
/packages/apps/Bluetooth/res/values/config.xml
.
Utiliser la règle automobile par défaut
CarBluetoothService conserve les autorisations de profil par défaut. La liste des appareils connus et leurs priorités de reconnexion de profil se trouve dans service/src/com/android/car/BluetoothProfileDeviceManager.java
.
La règle de gestion des connexions Bluetooth est disponible dans
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
. Par défaut, cette règle définit les cas où le Bluetooth doit se connecter aux appareils associés et s'en déconnecter. Il gère également les cas spécifiques à la voiture pour déterminer quand l'adaptateur doit être activé et désactivé.
Créer votre propre règlement personnalisé de gestion des connexions automobiles
Si la règle automobile par défaut ne répond pas à vos besoins, vous pouvez également la désactiver au profit de votre propre règle personnalisée. Votre règle personnalisée est au minimum responsable de la détermination du moment où l'adaptateur Bluetooth doit être activé et désactivé, ainsi que du moment où les appareils doivent être connectés. Il est possible d'utiliser différents événements pour activer/désactiver l'adaptateur Bluetooth et lancer des connexions d'appareils, y compris des événements dus à des modifications de propriétés spécifiques de la voiture.
Désactiver la règle automobile par défaut
Tout d'abord, pour utiliser une règle personnalisée, la règle automobile par défaut doit être désactivée en définissant useDefaultBluetoothConnectionPolicy
sur false
dans une couche de ressources.
Cette ressource est initialement définie dans MAXIMUM_CONNECTED_DEVICES
dans
packages/services/Car/service/res/values/config.xml
.
Activer et désactiver l'adaptateur Bluetooth
L'une des fonctions principales de votre stratégie consiste à activer et désactiver l'adaptateur Bluetooth aux moments appropriés. Vous pouvez utiliser les API de framework BluetoothAdapter.enable()
et BluetoothAdapter.disable()
pour activer et désactiver l'adaptateur.
Ces appels doivent respecter l'état persistant que l'utilisateur a sélectionné dans les paramètres ou par tout autre moyen. Pour ce faire, vous pouvez procéder comme suit :
/** * Turn on the Bluetooth adapter. */ private void enableBluetooth() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { return; } bluetoothAdapter.enable(); } /** * Turn off the Bluetooth adapter. */ private void disableBluetooth() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { return; } // Will shut down _without_ persisting the off state as the desired state // of the Bluetooth adapter for next start up. This does nothing if the adapter // is already off, keeping the existing saved desired state for next reboot. bluetoothAdapter.disable(false); }
Déterminer quand activer et désactiver l'adaptateur Bluetooth
Avec votre règle personnalisée, vous êtes libre de déterminer quels événements indiquent les meilleurs moments pour activer et désactiver l'adaptateur. Pour ce faire, vous pouvez par exemple utiliser les états d'alimentation MAXIMUM_CONNECTED_DEVICES
dans CarPowerManager
:
private final CarPowerStateListenerWithCompletion mCarPowerStateListener = new CarPowerStateListenerWithCompletion() { @Override public void onStateChanged(int state, CompletableFuture<Void> future) { if (state == CarPowerManager.CarPowerStateListener.ON) { if (isBluetoothPersistedOn()) { enableBluetooth(); } return; } // "Shutdown Prepare" is when the user perceives the car as off // This is a good time to turn off Bluetooth if (state == CarPowerManager.CarPowerStateListener.SHUTDOWN_PREPARE) { disableBluetooth(); // Let CarPowerManagerService know we're ready to shut down if (future != null) { future.complete(null); } return; } } };
Déterminer quand connecter des appareils
De même, lorsque vous déterminez les événements qui doivent déclencher les connexions d'appareils pour commencer,
CarBluetoothManager fournit l'appel d'API connectDevices()
qui
procède à la connexion des appareils en fonction des listes de priorité définies pour chaque profil Bluetooth.
Voici un exemple de situation dans laquelle cela pourrait vous être utile : chaque fois que l'adaptateur Bluetooth s'allume :
private class BluetoothBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); if (state == BluetoothAdapter.STATE_ON) { // mContext should be your app's context Car car = Car.createCar(mContext); CarBluetoothManager carBluetoothManager = (CarBluetoothManager) car.getCarManager(Car.BLUETOOTH_SERVICE); carBluetoothManager.connectDevices(); } } } }
Vérifier la gestion de la connectivité automobile
Le moyen le plus simple de vérifier le comportement de votre règle de connexion consiste à activer le Bluetooth sur votre IVI et à vérifier qu'il se connecte automatiquement aux bons appareils dans le bon ordre. Vous pouvez activer ou désactiver l'adaptateur Bluetooth dans l'interface utilisateur des paramètres ou à l'aide des commandes adb suivantes :
adb shell su u$(adb shell am get-current-user)_system svc bluetooth disable
adb shell su u$(adb shell am get-current-user)_system svc bluetooth enable
De plus, le résultat de la commande suivante peut être utilisé pour afficher des informations de débogage liées aux connexions Bluetooth :
adb shell dumpsys car_service
Enfin, si vous avez créé votre propre règle automobile, la vérification de tout comportement de connexion personnalisé nécessite de contrôler les événements que vous avez choisis pour déclencher les connexions d'appareils.
Profils Bluetooth automobiles
Dans Android, l'IVI peut prendre en charge plusieurs appareils connectés simultanément via Bluetooth. Les services téléphoniques Bluetooth multi-appareils permettent aux utilisateurs de connecter plusieurs appareils simultanément, comme un téléphone personnel et un téléphone professionnel, et de passer des appels en mode mains libres depuis l'un ou l'autre appareil.
Les limites de connexion sont appliquées par chaque profil Bluetooth individuel, généralement dans l'implémentation du service de profil lui-même. Par défaut, CarBluetoothService ne se prononce pas sur le nombre maximal d'appareils connectés autorisés.
Profil mains libres
Le profil mains libres Bluetooth (HFP) permet au véhicule de passer et de recevoir des appels téléphoniques via un appareil distant connecté. Chaque connexion d'appareil enregistre un compte de téléphone distinct auprès de TelecomManager, qui annonce tous les comptes de téléphone disponibles aux applications IVI.
L'IVI peut se connecter à plusieurs appareils via HFP. MAX_STATE_MACHINES_POSSIBLE
MAXIMUM_CONNECTED_DEVICES
dans
HeadsetClientService
définit le nombre maximal de connexions HFP simultanées.
Lorsqu'un utilisateur passe ou reçoit un appel téléphonique depuis un appareil, le compte de téléphone correspondant crée un objet HfpClientConnection
. L'application Téléphone interagit avec l'objet HfpClientConnection
pour gérer les fonctionnalités d'appel, comme accepter un appel ou raccrocher.
Il convient de noter que l'application Téléphone par défaut n'est pas compatible avec plusieurs appareils HFP connectés simultanément. Pour implémenter le profil mains libres multi-appareils, une personnalisation est requise pour permettre aux utilisateurs de sélectionner le compte d'appareil à utiliser lors d'un appel. L'application appelle ensuite telecomManager.placeCall
avec le bon compte. Vous devez également vérifier que les autres fonctionnalités multi-appareils fonctionnent comme prévu.
Vérifier le profil mains libres (HFP) multi-appareils
Pour vérifier que la connectivité multi-appareils fonctionne correctement via Bluetooth :
- À l'aide du Bluetooth, connectez un appareil à l'IVI et diffusez l'audio depuis l'appareil.
- Connectez deux téléphones à l'IVI via Bluetooth.
- Choisissez un téléphone. Passer un appel sortant directement depuis le téléphone et passer un appel sortant à l'aide de l'IVI.
- À chaque fois, vérifiez que le flux audio est mis en pause et que le son du téléphone est diffusé sur les enceintes connectées IVI.
- Sur le même téléphone, recevez un appel entrant directement sur le téléphone et recevez un appel entrant à l'aide de l'IVI.
- À chaque fois, vérifiez que le flux audio s'interrompt et que le son du téléphone est diffusé sur les enceintes connectées IVI.
- Répétez les étapes 3 et 4 avec l'autre téléphone connecté.
Appels d'urgence
La possibilité de passer des appels d'urgence est un aspect important des fonctions de téléphonie et Bluetooth de la voiture. Il existe plusieurs façons de passer un appel d'urgence depuis l'IVI :
- Solution eCall autonome
- Solution eCall intégrée au système IVI
- Utiliser un téléphone connecté en Bluetooth lorsqu'aucun système intégré n'est disponible
Passer un appel d'urgence
Bien que l'équipement eCall soit essentiel pour la sécurité, il n'est actuellement pas intégré à Android. Il est possible d'utiliser ConnectionService pour exposer les fonctionnalités d'appel d'urgence via Android, ce qui présente également l'avantage d'introduire des options d'accessibilité pour les appels d'urgence. Pour en savoir plus, consultez Créer une application d'appel.
Voici un exemple de la façon d'établir une ConnectionService d'urgence :
public class YourEmergencyConnectionService extends ConnectionService { @Override public Connection onCreateOutgoingConnection( PhoneAccountHandle connectionManagerAccount, ConnectionRequest request) { // Your equipment specific procedure to make ecall // ... } private void onYourEcallEquipmentReady() { PhoneAccountHandle handle = new PhoneAccountHandle(new ComponentName(context, YourEmergencyConnectionService), YourEmergencyConnectionId); PhoneAccount account = new PhoneAccount.Builder(handle, eCallOnlyAccount) .setSupportedUriSchemes(Arrays.asList(PhoneAccount.SCHEME_TEL)) .setCapabilities(PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS | PhoneAccount.CAPABILITY_MULTI_USER) .build(): mTelecomManager.registerPhoneAccount(account); mTelecomManager.enablePhoneAccount(account.getAccountHandle(), true); } }
Activer le Bluetooth pour les appels d'urgence
Avant Android 10, appeler les services d'urgence impliquait de composer directement un numéro de téléphone et d'utiliser un équipement spécial si disponible (par exemple, un déclenchement automatique en cas de détection d'un danger ou d'une action de l'utilisateur). Dans Android 10 et versions ultérieures, le clavier de saisie du numéro de téléphone dans la voiture peut appeler directement un numéro d'urgence, à condition que MAXIMUM_CONNECTED_DEVICES
soit défini sur
apps/Bluetooth/res/values/config.xml
:
<!-- For supporting emergency call through the hfp client connection service -->
<bool name=”hfp_client_connection_service_support_emergency_call”>true</bool>
En implémentant les appels d'urgence de cette manière, d'autres applications, telles que la reconnaissance vocale, peuvent également appeler un numéro d'urgence.
Profil d'accès au répertoire
Le profil d'accès au répertoire téléphonique Bluetooth (PBAP) télécharge les contacts et l'historique des appels depuis un appareil distant connecté. PBAP gère une liste agrégée de contacts dans laquelle il est possible d'effectuer des recherches. Cette liste est mise à jour par la machine à états du client PBAP. Chaque appareil connecté interagit avec une machine à états client PBAP distincte, ce qui permet d'associer les contacts à l'appareil approprié lors d'un appel.
PBAP est unidirectionnel et nécessite donc que l'IVI instancie les connexions à tout MAXIMUM_CONNECTED_DEVICES
dans
PbapClientService
, qui définit le nombre maximal de connexions d'appareils PBAP simultanées autorisées avec l'IVI. Le client PBAP stocke les contacts de chaque appareil connecté dans le
fournisseur de contacts, auquel une application peut ensuite accéder pour obtenir le répertoire téléphonique de chaque appareil.
De plus, la connexion du profil doit être autorisée à la fois par l'IVI et l'appareil mobile pour qu'une connexion puisse être établie. Lorsqu'un client PBAP se déconnecte, la base de données interne supprime tous les contacts et l'historique des appels associés à l'appareil précédemment connecté.
Profil d'accès aux messages
Le profil d'accès aux messages (MAP) du Bluetooth permet au véhicule d'envoyer et de recevoir des SMS via un appareil distant connecté. Actuellement, les messages ne sont pas stockés localement sur l'IVI. Au lieu de cela, chaque fois que l'appareil distant connecté reçoit un message, l'IVI le reçoit et l'analyse, puis diffuse son contenu dans une instance Intent, qui peut ensuite être reçue par une application.
Pour se connecter à un appareil mobile afin d'envoyer et de recevoir des messages, l'IVI doit initier la connexion MAP.
MAXIMUM_CONNECTED_DEVICES
dans
MapClientService
définit le nombre maximal de connexions simultanées d'appareils MAP autorisées avec l'IVI. Chaque connexion doit être autorisée par l'IVI et l'appareil mobile avant que les messages puissent être transférés.
Advanced Audio Distribution Profile
Le profil de distribution audio avancé (A2DP) du Bluetooth permet au véhicule de recevoir des flux audio depuis un appareil distant connecté.
Contrairement aux autres profils, le nombre maximal d'appareils A2DP connectés est appliqué dans la pile native et non en Java. La valeur est actuellement codée en dur sur 1
à l'aide de la variable kDefaultMaxConnectedAudioDevices
dans
packages/modules/Bluetooth/system/btif/src/btif_av.cc
.
Audio/video Remote Control Profile
Le profil Bluetooth Audio/Video Remote Control Profile (AVRCP) permet au véhicule de contrôler et de parcourir les lecteurs multimédias sur un appareil distant connecté. Étant donné que l'IVI joue le rôle de contrôleur AVRCP, toutes les commandes déclenchées qui affectent la lecture audio reposent sur une connexion A2DP à l'appareil cible.
Pour qu'un lecteur multimédia spécifique sur un téléphone Android puisse être parcouru par l'IVI via AVRCP, l'application multimédia sur le téléphone doit fournir un
MediaBrowserService
et autoriser l'accès com.android.bluetooth
à ce service. La section
Créer un service de navigateur multimédia explique en détail comment procéder.