Bluetooth

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:

  1. À l'aide du Bluetooth, connectez un appareil à l'IVI et diffusez l'audio depuis le appareil.
  2. Connectez deux téléphones à l'IVI via le Bluetooth.
  3. 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.
    1. 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.
  4. recevoir un appel entrant directement sur le même téléphone ; recevoir un appel entrant à l’aide de l’IV.
    1. 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.
  5. 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.