Bluetooth

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:

  1. Tramite il Bluetooth, collega un dispositivo all'IVI e trasmetti l'audio in streaming dalla dispositivo.
  2. Collega due telefoni al sistema IVI tramite Bluetooth.
  3. Scegli un telefono. Effettuando una chiamata in uscita direttamente dal telefono, ed effettuare una chiamata in uscita utilizzando l'IVI.
    1. Entrambe le volte, verifica le pause dell'audio in streaming e dell'audio dello smartphone vengono riprodotti tramite gli altoparlanti connessi IVI.
  4. Utilizzando lo stesso smartphone, ricevi una chiamata in arrivo direttamente sullo smartphone e ricevere una chiamata in arrivo utilizzando l'IVI.
    1. Entrambe le volte, verifica le pause dell'audio in streaming e l'audio dello smartphone viene riprodotto tramite gli altoparlanti connessi IVI.
  5. 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.