Android fornisce un'implementazione completa del Bluetooth con supporto per molti profili Bluetooth comuni per le auto. Sono stati apportati anche molti miglioramenti che aumentano le prestazioni e l'esperienza con altri dispositivi e servizi.
Gestione della connessione Bluetooth
In Android, CarBluetoothService gestisce i dispositivi Bluetooth dell'utente corrente e gli elenchi di priorità per ogni connessione del profilo al sistema infotainment. I dispositivi sono connessi ai profili in un ordine di priorità definito. Quando attivare, disattivare e connettere i dispositivi a un profilo è determinato da un criterio di connessione predefinito che può essere sostituito con l'utilizzo di un overlay di risorse, se desiderato.
Configurare la gestione delle connessioni per il settore automobilistico
Disattivare la norma predefinita per i telefoni
Lo stack Bluetooth di Android gestisce un criterio di connessione per gli smartphone che è attivo per
impostazione predefinita. Questa policy deve essere disattivata sul dispositivo in modo che non sia in conflitto con la
policy per il settore automobilistico prevista in
CarBluetoothService. Anche se l'overlay del prodotto Auto dovrebbe occuparsi di questo per te,
puoi disattivare le norme relative allo smartphone in un
overlay delle risorse impostando enable_phone_policy
su false
in
MAXIMUM_CONNECTED_DEVICES
in
/packages/apps/Bluetooth/res/values/config.xml
.
Utilizza il criterio automobilistico predefinito
CarBluetoothService mantiene le autorizzazioni del profilo predefinite. L'elenco dei dispositivi
noti e delle priorità di riconnessione dei profili si trova in
service/src/com/android/car/BluetoothProfileDeviceManager.java
.
Inoltre, il criterio di gestione della connessione Bluetooth è disponibile in
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
. Per impostazione predefinita,
questo criterio definisce le istanze in cui il Bluetooth deve connettersi e disconnettersi dai dispositivi
accoppiati. Gestisce anche i casi specifici dell'auto per quando l'adattatore deve essere acceso e spento.
Crea la tua norma personalizzata di gestione delle connessioni per il settore automobilistico
Se le norme per il settore automobilistico predefinite non soddisfano le tue esigenze, possono anche essere disattivate a favore di norme personalizzate. La tua policy personalizzata è responsabile, come minimo, di determinare quando attivare e disattivare l'adattatore Bluetooth, nonché quando connettere i dispositivi. È possibile utilizzare una serie di eventi per attivare/disattivare l'adattatore Bluetooth e per avviare le connessioni dei dispositivi, inclusi gli eventi dovuti a modifiche di specifiche proprietà dell'auto.
Disattivare la norma automobilistica predefinita
Innanzitutto, per utilizzare un criterio personalizzato, il criterio automobilistico predefinito deve essere disattivato
impostando useDefaultBluetoothConnectionPolicy
su false
in una
sovrapposizione di risorse.
Questa risorsa è originariamente definita come parte di
MAXIMUM_CONNECTED_DEVICES
in
packages/services/Car/service/res/values/config.xml
.
Attivare e disattivare l'adattatore Bluetooth
Una delle funzioni principali della tua policy è attivare e disattivare l'adattatore Bluetooth
nei momenti opportuni. Puoi utilizzare le API dei framework BluetoothAdapter.enable()
e
BluetoothAdapter.disable()
per abilitare e disabilitare l'adattatore.
Queste chiamate devono rispettare lo stato persistente selezionato dall'utente tramite le Impostazioni o
qualsiasi altro mezzo. Un modo per farlo è il seguente:
/** * 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); }
Determinare quando attivare e disattivare l'adattatore Bluetooth
Con la tua policy personalizzata, puoi determinare liberamente quali eventi indicano i momenti migliori per attivare e disattivare l'adattatore. Un modo per farlo è utilizzare gli stati di alimentazione
MAXIMUM_CONNECTED_DEVICES
in
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; } } };
Determinare quando connettere i dispositivi
Analogamente, quando determini gli eventi che devono attivare le connessioni dei dispositivi,
CarBluetoothManager fornisce la chiamata API connectDevices()
che
procede alla connessione dei dispositivi in base agli elenchi di priorità definiti per ogni profilo Bluetooth.
Un esempio di quando potresti volerlo fare è ogni volta che l'adattatore Bluetooth si accende:
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(); } } } }
Verificare la gestione della connessione automobilistica
Il modo più semplice per verificare il comportamento della policy di connessione è attivare il Bluetooth sul sistema di infotainment e verificare che si connetta automaticamente ai dispositivi corretti nell'ordine appropriato. Puoi attivare/disattivare l'adattatore Bluetooth tramite l'interfaccia utente delle impostazioni o con i seguenti comandi adb:
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
Inoltre, l'output del seguente comando può essere utilizzato per visualizzare le informazioni di debug relative alle connessioni Bluetooth:
adb shell dumpsys car_service
Infine, se hai creato una tua policy per il settore automobilistico, la verifica di qualsiasi comportamento di connessione personalizzato richiede il controllo degli eventi che hai scelto per attivare le connessioni dei dispositivi.
Profili Bluetooth per auto
In Android, l'IVI può supportare più dispositivi connessi contemporaneamente tramite Bluetooth. I servizi di telefonia Bluetooth multi-dispositivo consentono agli utenti di connettere più dispositivi contemporaneamente, ad esempio un telefono personale e uno di lavoro, ed effettuare chiamate in vivavoce da entrambi i dispositivi.
I limiti di connessione vengono applicati da ogni singolo profilo Bluetooth, in genere all'interno dell'implementazione del servizio di profilo stesso. Per impostazione predefinita, CarBluetoothService non esprime ulteriori giudizi sul numero massimo di dispositivi connessi consentiti.
Profilo vivavoce
Il profilo Bluetooth Hands-Free (HFP) consente al veicolo di effettuare e ricevere chiamate tramite un dispositivo remoto connesso. Ogni connessione del dispositivo registra un account telefono separato con TelecomManager, che pubblicizza tutti gli account telefono disponibili alle app IVI.
Il sistema di infotainment può connettersi a più dispositivi tramite HFP. MAX_STATE_MACHINES_POSSIBLE
MAXIMUM_CONNECTED_DEVICES
in
HeadsetClientService
definisce il numero massimo di connessioni HFP simultanee.
Quando un utente effettua o riceve una chiamata da un dispositivo, l'account
telefono corrispondente crea un oggetto HfpClientConnection
. L'app Telefono
interagisce con l'oggetto HfpClientConnection
per gestire le funzionalità
di chiamata, ad esempio accettare una chiamata o riagganciare.
È importante notare che l'app Telefono predefinita non supporta più dispositivi HFP
connessi contemporaneamente. Per implementare HFP su più dispositivi, è necessaria la personalizzazione
per consentire agli utenti di selezionare l'account del dispositivo da utilizzare quando effettuano una chiamata. L'app chiama
telecomManager.placeCall
con l'account corretto. Devi
verificare che anche le altre funzionalità multi-dispositivo funzionino come previsto.
Verificare HFP multi-dispositivo
Per verificare che la connettività multi-dispositivo funzioni correttamente tramite Bluetooth:
- Utilizzando il Bluetooth, connetti un dispositivo all'IVI e riproduci in streaming l'audio dal dispositivo.
- Collega due smartphone all'IVI tramite Bluetooth.
- Scegli un telefono. Effettua una chiamata in uscita direttamente dallo smartphone
ed effettua una chiamata in uscita utilizzando l'IVI.
- In entrambi i casi, verifica che l'audio in streaming si interrompa e che l'audio dello smartphone venga riprodotto dagli speaker connessi al sistema di infotainment.
- Utilizzando lo stesso smartphone, ricevi una chiamata in arrivo direttamente sullo smartphone e
ricevi una chiamata in arrivo utilizzando l'IVI.
- In entrambi i casi, verifica che l'audio in streaming si interrompa e che l'audio del telefono venga riprodotto dagli speaker connessi all'impianto infotainment.
- Ripeti i passaggi 3 e 4 con l'altro smartphone connesso.
Chiamate di emergenza
La possibilità di effettuare chiamate di emergenza è un aspetto importante delle funzioni di telefonia e Bluetooth dell'auto. Esistono diversi modi per avviare una chiamata di emergenza dal sistema infotainment, tra cui:
- Soluzione eCall autonoma
- Soluzione eCall integrata nel sistema IVI
- Utilizzo di uno smartphone connesso tramite Bluetooth quando non è disponibile un sistema integrato
Connettere una chiamata di emergenza
Sebbene l'apparecchiatura eCall sia fondamentale per la sicurezza, al momento non è integrata in Android. È possibile utilizzare ConnectionService per esporre le funzionalità di chiamata di emergenza tramite Android, che offre anche il vantaggio di introdurre opzioni di accessibilità per le chiamate di emergenza. Per saperne di più, vedi Creare un'app di chiamata.
Ecco un esempio di come stabilire un servizio ConnectionService di emergenza:
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); } }
Attivare il Bluetooth per le chiamate di emergenza
La chiamata di emergenza prima di Android 10 prevedeva la composizione diretta da un telefono e l'utilizzo
di apparecchiature speciali, se disponibili (ad esempio, l'attivazione automatica al rilevamento di un pericolo o di un'azione dell'utente). In Android 10 e versioni successive, il tastierino dell'auto può chiamare direttamente un
numero di emergenza, a condizione che questo MAXIMUM_CONNECTED_DEVICES
in
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>
Implementando le chiamate di emergenza in questo modo, anche altre app, come il riconoscimento vocale, possono chiamare un numero di emergenza.
Profilo di accesso alla rubrica
Il profilo Bluetooth Phone Book Access (PBAP) scarica i contatti e le cronologie chiamate da un dispositivo remoto connesso. PBAP gestisce un elenco aggregato e ricercabile di contatti aggiornato dalla macchina a stati del client PBAP. Ogni dispositivo connesso interagisce con una macchina a stati client PBAP separata, in modo che i contatti vengano associati al dispositivo corretto quando si effettua una chiamata.
PBAP è unidirezionale e pertanto richiede all'IVI di creare istanze di connessioni a qualsiasi
MAXIMUM_CONNECTED_DEVICES
in
PbapClientService
definisce il numero massimo di connessioni simultanee di dispositivi PBAP consentite con l'IVI. Il client PBAP memorizza i contatti per ogni
dispositivo connesso nel
provider di contatti, a cui un'app può accedere per ricavare la rubrica
per ogni dispositivo.
Inoltre, la connessione del profilo deve essere autorizzata sia dal sistema di infotainment sia dal dispositivo mobile per poter essere stabilita. Quando un client PBAP si disconnette, il database interno rimuove tutti i contatti e la cronologia chiamate associati al dispositivo connesso in precedenza.
Profilo di accesso ai messaggi
Il profilo Bluetooth Message Access (MAP) consente al veicolo di inviare e ricevere messaggi SMS tramite un dispositivo remoto connesso. Al momento, i messaggi non vengono memorizzati localmente sul sistema di infotainment. Invece, ogni volta che il dispositivo remoto connesso riceve un messaggio, l'IVI riceve e analizza il messaggio e trasmette i suoi contenuti in un'istanza Intent, che può poi essere ricevuta da un'app.
Per connettersi a un dispositivo mobile allo scopo di inviare e ricevere
messaggi, il sistema di infotainment deve avviare la connessione MAP.
MAXIMUM_CONNECTED_DEVICES
in
MapClientService
definisce il numero massimo di connessioni simultanee di dispositivi MAP
consentite con l'IVI. Ogni connessione deve essere autorizzata dall'IVI e dal
dispositivo mobile prima che i messaggi possano essere trasferiti.
Advanced Audio Distribution Profile
Il profilo Bluetooth Advanced Audio Distribution (A2DP) consente al veicolo di ricevere flussi audio da un dispositivo remoto connesso.
A differenza di altri profili, il numero massimo di dispositivi A2DP connessi viene applicato nello stack nativo e non in Java. Il valore è attualmente codificato in modo permanente su 1
utilizzando
la variabile kDefaultMaxConnectedAudioDevices
in
packages/modules/Bluetooth/system/btif/src/btif_av.cc
.
Profilo di controllo remoto audio/video
Il profilo Bluetooth Audio/video Remote Control (AVRCP) consente al veicolo di controllare e sfogliare i lettori multimediali su un dispositivo remoto connesso. Poiché il sistema di infotainment svolge il ruolo di un controller AVRCP, tutti i controlli attivati che influiscono sulla riproduzione audio si basano su una connessione A2DP al dispositivo di destinazione.
Affinché un lettore multimediale specifico su uno smartphone Android sia sfogliabile dall'IVI tramite AVRCP,
l'app multimediale sullo smartphone deve fornire un
MediaBrowserService
e consentire l'accesso com.android.bluetooth
a
questo servizio.
La sezione Creare un servizio di esplorazione dei contenuti multimediali spiega come farlo in dettaglio.