Android offre une complète Bluetooth implémentation ainsi que la prise en charge de nombreux profils Bluetooth courants dans les voitures. Il existe également de nombreuses améliorations qui améliorent les performances et l'expérience avec d'autres appareils et services.
Gestion des connexions Bluetooth
Sous Android, CarBluetoothService conserve les appareils Bluetooth et la priorité de l'utilisateur actuel pour chaque connexion de profil à l'IV. Les appareils sont connectés à des profils dans un un ordre de priorité défini. Dans quels cas activer, désactiver et connecter des appareils à un profil est est régie par une règle de connexion par défaut qui peut être remplacée par l'utilisation d'un superposition de ressources, si comme vous le souhaitez.
Configurer la gestion des connexions automobiles
Désactiver la règle par défaut relative aux téléphones
La pile Bluetooth Android maintient une règle de connexion pour les téléphones activée par
par défaut. Cette règle doit être désactivée sur votre appareil pour qu'elle n'entre pas en conflit
politique automobile prévue dans
<ph type="x-smartling-placeholder"></ph>
CarBluetoothService. Bien que la superposition de produits automobile
s'occupe de cela pour vous,
vous pouvez désactiver la politique de téléphonie dans un
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
<ph type="x-smartling-placeholder"></ph>
CarBluetoothService conserve les autorisations de profil par défaut. La liste des
et les priorités de reconnexion de leur profil
service/src/com/android/car/BluetoothProfileDeviceManager.java
Vous trouverez également la règle de gestion des connexions Bluetooth dans
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
. Par défaut,
cette règle définit les cas dans lesquels le Bluetooth doit se connecter et se déconnecter
appareils. Il gère également les cas spécifiques à la voiture pour savoir quand l'adaptateur doit être allumé et
désactivée.
Créer votre propre règle de gestion des connexions automobile personnalisée
Si la règle Automotive par défaut ne répond pas à vos besoins, vous pouvez la désactiver en faveur de vos propres règles personnalisées. Vos règles personnalisées sont au minimum responsables pour déterminer quand activer et désactiver l'adaptateur Bluetooth, et quand connecter des appareils. Plusieurs événements permettent d'activer ou de désactiver le Bluetooth. l'adaptateur secteur et d'initier des connexions d'appareil, y compris en cas d'événements dus à des modifications dans des les propriétés 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
définir useDefaultBluetoothConnectionPolicy
sur false
dans une
superposition de ressources.
Cette ressource est initialement définie dans le cadre de
MAXIMUM_CONNECTED_DEVICES
dans
packages/services/Car/service/res/values/config.xml
.
Activer et désactiver l'adaptateur Bluetooth
L'une des principales fonctions de votre règle consiste à activer et désactiver l'adaptateur Bluetooth
aux moments appropriés. Vous pouvez utiliser BluetoothAdapter.enable()
et
API du framework BluetoothAdapter.disable()
pour activer et désactiver l'adaptateur.
Ces appels doivent respecter l'état persistant sélectionné par l'utilisateur 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 allumer et éteindre l'adaptateur Bluetooth
Grâce à votre règle personnalisée, vous êtes libre de déterminer les événements qui indiquent le meilleur moment pour
activer et désactiver l'adaptateur. Une façon de le faire est
d'utiliser les états d'alimentation
MAXIMUM_CONNECTED_DEVICES
po
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 des connexions d'appareils
commencer,
CarBluetoothManager fournit l'appel d'API connectDevices()
qui
se connecte aux appareils en fonction des listes
de priorité définies pour chaque profil Bluetooth.
Par exemple, lorsque 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 des connexions automobiles
Le moyen le plus simple de vérifier le comportement de votre règle de connexion consiste à activer le Bluetooth votre IVI et vérifiez qu'il se connecte automatiquement aux appareils appropriés dans l'ordre approprié. Vous pouvez activer/désactiver l'adaptateur Bluetooth via l'interface utilisateur des paramètres ou avec les 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 les informations de débogage liés aux connexions Bluetooth:
adb shell dumpsys car_service
Enfin, si vous avez créé votre propre règle automobile, en vérifiant toute connexion personnalisée nécessite de contrôler les événements que vous avez choisis pour déclencher l'appareil connexions externes.
Profils Bluetooth pour les voitures
Sous Android, l'IVI prend en charge plusieurs appareils connectés simultanément via le Bluetooth. Les services téléphoniques Bluetooth multi-appareils permettent aux utilisateurs de se connecter différents appareils simultanément, tels qu'un téléphone personnel et un téléphone professionnel, et en mode mains libres à partir de l'un ou l'autre de ces appareils.
Les limites de connexion sont appliquées par chaque profil Bluetooth, généralement dans le l'implémentation du service de profil lui-même. Par défaut, <ph type="x-smartling-placeholder"></ph> CarBluetoothService ne prend pas d'autres décisions quant au nombre maximal appareils autorisés.
Profil mains libres
Le profil mains libres Bluetooth (HFP) permet au véhicule de créer et de recevoir des appels via un appareil distant connecté. Chaque connexion d'appareil enregistre un téléphone distinct compte avec 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 d'FPS simultanées
connexions externes.
Lorsqu'un utilisateur passe ou reçoit un appel téléphonique depuis un appareil, l'appel
le compte de téléphone crée un objet HfpClientConnection
. L'application Téléphone
interagit avec l'objet HfpClientConnection
pour gérer l'appel
comme accepter un appel ou raccrocher.
Il convient de noter que l'application Téléphone par défaut ne prend pas en charge plusieurs appels simultanés
appareils HFP connectés. La personnalisation est nécessaire pour implémenter la fonctionnalité HFP multi-appareil.
pour permettre aux utilisateurs de sélectionner le compte de l'appareil à utiliser pour passer un appel. L'application
appelle telecomManager.placeCall
avec le compte approprié. Vous devez
vérifier que d'autres fonctionnalités multi-appareils fonctionnent également comme prévu.
Vérifier le protocole HFP multi-appareil
Pour vérifier que la connectivité multi-appareil fonctionne correctement via le Bluetooth:
- À l'aide du Bluetooth, connectez un appareil à l'IVI et diffusez l'audio depuis le appareil.
- Connectez deux téléphones à l'IVI via le Bluetooth.
- Choisissez un téléphone. Passez un appel sortant directement depuis le téléphone
et passer un appel sortant
à l’aide de l’IV.
- Vérifiez les deux fois que l'audio diffusé est mis en pause et que l'audio du téléphone est mis en pause est diffusé sur les enceintes connectées IVI.
- recevoir un appel entrant directement sur le même téléphone ;
recevoir un appel entrant
à l’aide de l’IV.
- Vérifiez les deux fois que le flux audio se met en pause et que l'audio du téléphone est diffusé sur les haut-parleurs connectés de l'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 de la téléphonie et Le Bluetooth fonctionne dans la voiture. Un appel d'urgence peut être effectué de plusieurs façons être initiés à partir de l'IVI, notamment:
- Solution eCall autonome
- Solution eCall intégrée à l'IVI
- Utiliser un téléphone Bluetooth connecté lorsqu'aucun système intégré n'est disponible
Passer un appel d'urgence
Bien que l'équipement d'appel électronique soit essentiel à 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, qui offre également l'avantage de proposer des options d'accessibilité pour les appels d'urgence. Pour en savoir plus, consultez <ph type="x-smartling-placeholder"></ph> Créer une application d'appel
Voici un exemple de configuration d'urgence <ph type="x-smartling-placeholder"></ph> ConnectionService:
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
Pour appeler les services d'urgence avant Android 10, il fallait passer un appel direct à partir d'un téléphone
des équipements spéciaux, le cas échéant (par exemple, un déclenchement automatique lors de la détection d'un danger
action utilisateur). Sur Android 10 ou version ultérieure, le clavier de votre voiture peut appeler directement un
numéro d'urgence, fourni MAXIMUM_CONNECTED_DEVICES
dans
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, comme la reconnaissance vocale, peuvent appeler également un numéro d'urgence.
Profil d'accès au répertoire téléphonique
Le profil PBAP (Bluetooth Phone Book Access Profile) télécharge les contacts et l'historique des appels depuis un appareil distant connecté. PBAP gère une liste agrégée et interrogeable les contacts mis à jour par la machine d'état du client PBAP. Chaque appareil connecté interagit avec une machine d'état client PBAP distincte, ce qui entraîne le transfert de contacts associés au bon appareil lors d'un appel.
PBAP est unidirectionnel et nécessite donc que l’IVI instancie des connexions vers
MAXIMUM_CONNECTED_DEVICES
po
PbapClientService
définit le nombre maximal d'appareils PBAP simultanés
les connexions autorisées
avec l’IV. Le client PBAP stocke les contacts pour chaque
l'appareil connecté
<ph type="x-smartling-placeholder"></ph>
Contacts Provider, auxquels une application peut ensuite accéder pour obtenir le téléphone
pour chaque appareil.
En outre, la connexion au profil doit être autorisée à la fois par l'IVI et par un appareil mobile pour établir une connexion. 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 Bluetooth (MAP) permet au véhicule d'envoyer et de recevoir des SMS messages via un appareil distant connecté. Actuellement, les messages ne sont pas stockés localement l'IVI. Chaque fois que l'appareil distant connecté reçoit un message, reçoit et analyse le message, puis diffuse son contenu l'instance Intent, qui peut ensuite être reçu par une application.
afin de se connecter à un appareil mobile dans le but d’envoyer et de recevoir
, l'IV doit initier la connexion MAP.
MAXIMUM_CONNECTED_DEVICES
dans
MapClientService
définit le nombre maximal d'appareils MAP simultanés
les connexions autorisées
avec l’IV. Chaque connexion doit être autorisée par l'IVI et le
un appareil mobile avant que les messages puissent être transférés.
Profil de distribution audio avancée
Le profil A2DP (Bluetooth Advanced Audio Distribution Profile) permet au véhicule de recevoir flux audio d'un appareil distant connecté.
Contrairement aux autres profils, le nombre maximal d'appareils A2DP connectés est imposé
et non en Java. La valeur est actuellement codée en dur dans 1
en utilisant
la variable kDefaultMaxConnectedAudioDevices
dans
packages/modules/Bluetooth/system/btif/src/btif_av.cc
Profil de télécommande audio/vidéo
Le profil Bluetooth Audio/Video Remote Control Profile (AVRCP) permet au véhicule de contrôler et parcourir les lecteurs multimédias sur un appareil distant connecté. Puisque l'IVI joue le rôle de un contrôleur AVRCP, toutes les commandes déclenchées qui affectent la lecture audio reposent sur un protocole A2DP à l'appareil cible.
Pour qu'un lecteur multimédia spécifique sur un téléphone Android
soit consultable par l'IVI via AVRCP,
l'application multimédia sur le téléphone doit fournir une
MediaBrowserService
et autoriser com.android.bluetooth
à accéder à
pour ce service. <ph type="x-smartling-placeholder"></ph>
"Créer un service de navigateur multimédia" explique en détail comment procéder.