Android offre una funzionalità Bluetooth completa implementazione con il supporto di molti profili Bluetooth comuni per l'auto. Ci sono anche miglioramenti che migliorano le prestazioni e l'esperienza con altri dispositivi e i servizi di machine learning.
Gestione connessione Bluetooth
In Android, CarBluetoothService mantiene i dispositivi Bluetooth e la priorità dell'utente corrente per ogni collegamento del profilo all'IVI. I dispositivi sono collegati ai profili in un un ordine di priorità definito. Quando attivare, disattivare e connettere i dispositivi a un profilo: generato da un criterio di connessione predefinito che può essere sostituito con l'uso di overlay di risorse, se desiderato.
Configura la gestione delle connessioni nel settore auto e motori
Disattivare il criterio telefono predefinito
Lo stack Bluetooth Android mantiene un criterio di connessione per i telefoni che viene attivato
predefinito. Questo criterio deve essere disattivato sul dispositivo per non essere in conflitto con
le norme relative al settore automobilistico
CarBluetoothService. L'overlay Prodotto auto dovrebbe occuparsi di questo problema,
puoi disattivare i criteri relativi al telefono in un
di risorse impostando enable_phone_policy
su false
MAXIMUM_CONNECTED_DEVICES
a
/packages/apps/Bluetooth/res/values/config.xml
.
Utilizza il criterio predefinito relativo ad auto e motori
CarBluetoothService mantiene le autorizzazioni del profilo predefinite. L'elenco dei pod
dispositivi e le relative priorità di riconnessione del profilo sono
service/src/com/android/car/BluetoothProfileDeviceManager.java
.
Anche il criterio di gestione della connessione Bluetooth è disponibile in
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
. Per impostazione predefinita,
questo criterio definisce i casi in cui il Bluetooth deve connettersi e disconnettersi da collegato
dispositivi mobili. Gestisce inoltre cover specifiche per le auto per quando l'alimentatore deve essere acceso e
disattivata.
Crea il tuo criterio personalizzato di gestione delle connessioni automobilistiche
Se il criterio predefinito relativo al settore auto e motori non è sufficiente per le tue esigenze, può anche essere disattivato. a favore della tua norma personalizzata. La tua norma personalizzata è responsabile per stabilire quando attivare e disattivare l'adattatore Bluetooth e quando connettere i dispositivi. È possibile utilizzare diversi eventi per attivare/disattivare il Bluetooth e avviare connessioni del dispositivo, inclusi gli eventi dovuti a modifiche in specifiche proprietà dell'auto.
Disattiva il criterio predefinito relativo ad auto e motori
Innanzitutto, per poter utilizzare una norma personalizzata, la norma predefinita relativa ad auto e motori deve essere disattivata
impostazione di useDefaultBluetoothConnectionPolicy
su false
in un
overlay delle risorse.
Questa risorsa è stata originariamente definita come parte di
MAXIMUM_CONNECTED_DEVICES
a
packages/services/Car/service/res/values/config.xml
.
Attiva e disattiva l'adattatore Bluetooth
Una delle funzioni principali dei criteri è l'attivazione e la disattivazione dell'adattatore Bluetooth all'indirizzo
nei momenti opportuni. Puoi utilizzare BluetoothAdapter.enable()
e
API del framework BluetoothAdapter.disable()
per abilitare e disabilitare l'adattatore.
Queste chiamate devono rispettare lo stato persistente selezionato dall'utente in Impostazioni.
qualsiasi altro mezzo. Un modo per farlo è:
/** * 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 le norme personalizzate puoi stabilire quali eventi indicano gli orari migliori per
attivare e disattivare l'adattatore. Un modo per farlo è utilizzare gli stati di alimentazione
MAXIMUM_CONNECTED_DEVICES
pollici
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; } } };
Determina quando connettere i dispositivi
Analogamente, quando stabilisci gli eventi che devono attivare le connessioni del dispositivo a
inizio,
CarBluetoothManager fornisce la chiamata API connectDevices()
che
connette i dispositivi in base agli elenchi di priorità definiti per ogni profilo Bluetooth.
Ad esempio, potresti voler svolgere questa operazione ogni volta che l'adattatore Bluetooth si attiva:
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(); } } } }
Verifica la gestione delle connessioni nel settore auto e motori
Il modo più semplice per verificare il comportamento dei criteri di connessione è attivare il Bluetooth la tua IVI e verifica che si connetta automaticamente ai dispositivi corretti nel 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 comando seguente può essere utilizzato per visualizzare le informazioni di debug relative alle connessioni Bluetooth:
adb shell dumpsys car_service
Infine, se hai creato una norma relativa al settore automobilistico, verifica eventuali connessioni personalizzate. richiede il controllo degli eventi scelti per attivare il dispositivo e connessioni a Internet.
Profili Bluetooth Automotive
In Android, l'IVI può supportare più dispositivi collegati simultaneamente tramite Bluetooth. I servizi telefonici Bluetooth multi-dispositivo consentono agli utenti di connettersi separa contemporaneamente dispositivi, ad esempio uno personale e uno di lavoro, e per le chiamate in vivavoce da entrambi i dispositivi.
I limiti di connessione vengono applicati da ogni singolo profilo Bluetooth, solitamente all'interno del servizio di profilo stesso. Per impostazione predefinita, CarBluetoothService non effettua ulteriori valutazioni sul numero massimo di dispositivi connessi dispositivi consentiti.
Profilo in vivavoce
Il profilo vivavoce Bluetooth (HFP) consente al veicolo di creare e ricevere smartphone tramite un dispositivo remoto connesso. Ogni connessione del dispositivo registra uno smartphone separato account con TelecomManager, che pubblicizza qualsiasi account telefonico disponibile per le app IVI.
L'IVI può connettersi a più dispositivi tramite HFP. MAX_STATE_MACHINES_POSSIBLE
MAXIMUM_CONNECTED_DEVICES
in
HeadsetClientService
definisce il numero massimo di HFP simultanee
e connessioni a Internet.
Quando un utente effettua o riceve una chiamata da un dispositivo, l'attributo corrispondente
Phone account crea un oggetto HfpClientConnection
. App Telefono
interagisce con l'oggetto HfpClientConnection
per gestire la chiamata
come accettare una chiamata o riagganciare.
Tieni presente che l'app Telefono predefinita non supporta più di una connessione contemporaneamente
dispositivi HFP connessi. Per implementare HFP multi-dispositivo, è richiesta la personalizzazione
per consentire agli utenti di selezionare l'account del dispositivo da utilizzare per effettuare una chiamata. L'app
chiama telecomManager.placeCall
con l'account corretto. Devi
verificare che anche le altre funzionalità multi-dispositivo funzionino come previsto.
Verifica HFP multi-dispositivo
Per verificare che la connettività multi-dispositivo funzioni correttamente tramite Bluetooth:
- Tramite il Bluetooth, collega un dispositivo all'IVI e trasmetti l'audio in streaming dalla dispositivo.
- Collega due telefoni al sistema IVI tramite Bluetooth.
- Scegli un telefono. Effettuando una chiamata in uscita direttamente dal telefono,
ed effettuare una chiamata in uscita utilizzando l'IVI.
- Entrambe le volte, verifica le pause dell'audio in streaming e dell'audio dello smartphone vengono riprodotti tramite gli altoparlanti connessi IVI.
- Utilizzando lo stesso smartphone, ricevi una chiamata in arrivo direttamente sullo smartphone e
ricevere una chiamata in arrivo utilizzando l'IVI.
- Entrambe le volte, verifica le pause dell'audio in streaming e l'audio dello smartphone viene riprodotto tramite gli altoparlanti connessi IVI.
- Ripeti i passaggi 3 e 4 con l'altro smartphone connesso.
Chiamate di emergenza
La possibilità di effettuare chiamate di emergenza è un aspetto importante del servizio di telefonia e Il Bluetooth funziona nell'auto. Esistono diversi modi in cui una chiamata di emergenza può essere avviate dall'IVI, inclusi:
- Soluzione eCall autonoma
- Soluzione eCall integrata nell'IVI
- Utilizzo di uno smartphone Bluetooth connesso quando non è disponibile alcun sistema integrato
Effettua 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 ha anche il vantaggio di introdurre opzioni di accessibilità per le chiamate di emergenza. Per saperne di più, vedi Creazione di un'app per le chiamate.
Ecco un esempio di come avviare una procedura di emergenza 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); } }
Attiva Bluetooth per chiamate di emergenza
La chiamata di emergenza prima di Android 10 prevede la composizione diretta da telefono e la chiamata
apparecchiature speciali, se disponibili (ad esempio, l'attivazione automatica al rilevamento di un pericolo o un
dell'utente). In Android 10 e versioni successive, l'app Telefono dell'auto può chiamare direttamente
numero di emergenza, fornito questo MAXIMUM_CONNECTED_DEVICES
tra
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 in questo modo le chiamate di emergenza, altre app, come il riconoscimento vocale, possono chiama anche un numero di emergenza.
Profilo di accesso alla rubrica
Il Bluetooth Phone Book Access Profile (PBAP) scarica i contatti e la cronologia chiamate da un dispositivo remoto connesso. PBAP mantiene un elenco aggregato e consultabile contatti aggiornati dalla macchina a stato del client PBAP. Ogni dispositivo connesso interagisce con una macchina a stato client PBAP separata, facendo sì che i contatti vengano associati al dispositivo corretto quando effettui una chiamata.
PBAP è unidirezionale e richiede quindi l'IVI per creare un'istanza delle connessioni
MAXIMUM_CONNECTED_DEVICES
pollici
PbapClientService
definisce il numero massimo di dispositivi PBAP simultanei
connessioni consentite con l'IVI. Il client PBAP archivia i contatti per ogni
dispositivo connesso nel
Provider di contatti a cui un'app può accedere per ricavare lo smartphone
per ciascun dispositivo.
Inoltre, il collegamento del profilo deve essere autorizzato sia dall'IVI che dal dispositivo mobile per stabilire una connessione. Quando un client PBAP si disconnette, il database interno rimuove tutti i contatti e la cronologia chiamate associati dispositivo connesso in precedenza.
Profilo di accesso ai messaggi
Il Bluetooth Message Access Profile (MAP) consente al veicolo di inviare e ricevere SMS tramite un dispositivo remoto connesso. Attualmente, i messaggi non sono archiviati localmente l'IVI. Ogni volta che il dispositivo remoto connesso riceve un messaggio, riceve e analizza il messaggio e ne trasmette il contenuto in una Intent, che possono essere ricevuti da un'app.
Per connettersi a un dispositivo mobile allo scopo di inviare e ricevere
messaggi, l'IVI deve avviare la connessione MAP.
MAXIMUM_CONNECTED_DEVICES
in
MapClientService
definisce il numero massimo di dispositivi MAP simultanei
connessioni consentite con l'IVI. Ogni connessione deve essere autorizzata dall'IVI e dal
dispositivo mobile prima che i messaggi possano essere trasferiti.
Profilo di distribuzione audio avanzata
Il Bluetooth Advanced Audio Distribution Profile (A2DP) consente al veicolo di ricevere stream audio da un dispositivo remoto connesso.
A differenza degli altri profili, il numero massimo di dispositivi A2DP connessi viene applicato in
e non in Java. Al momento il valore è impostato come hardcoded in 1
utilizzando
la variabile kDefaultMaxConnectedAudioDevices
in
packages/modules/Bluetooth/system/btif/src/btif_av.cc
.
Profilo del telecomando audio/video
Il profilo AVRCP (Bluetooth Audio/Video Remote Control Profile) consente al veicolo di controllare e sfogliare i lettori multimediali su un dispositivo remoto connesso. Poiché l'IVI ha il ruolo un controller AVRCP, tutti i controlli attivati che influenzano la riproduzione audio si basano su un A2DP connessione al dispositivo di destinazione.
Per fare in modo che un lettore multimediale specifico su uno smartphone Android possa essere esplorato dall'IVI tramite AVRCP,
l'app multimediale sul telefono deve fornire un
MediaBrowserService
e consenti all'app com.android.bluetooth
di accedere a
quel servizio.
Nella creazione di un servizio di browser multimediale viene spiegato come farlo in dettaglio.