Google 致力于为黑人社区推动种族平等。查看具体举措
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Bluetooth

Android fornisce un'implementazione Bluetooth completa con supporto per molti profili Bluetooth comuni per auto. Ci sono anche molti miglioramenti che migliorano le prestazioni e l'esperienza con altri dispositivi e servizi.

Gestione della connessione Bluetooth

In Android, CarBluetoothService mantiene i dispositivi Bluetooth dell'utente corrente e gli elenchi di priorità per ogni connessione del profilo all'IVI. I dispositivi sono collegati ai profili in un ordine di priorità definito. Quando abilitare, disabilitare e connettere i dispositivi a un profilo è determinato da un criterio di connessione predefinito che può essere sovrascritto con l'uso di una sovrapposizione di risorse , se lo si desidera.

Configurazione della gestione delle connessioni automobilistiche

Disabilita il criterio telefonico predefinito

Lo stack Bluetooth Android mantiene un criterio di connessione per i telefoni abilitato per impostazione predefinita. Questa norma deve essere disattivata sul tuo dispositivo in modo che non sia in conflitto con la norma automobilistica prevista in CarBluetoothService . Sebbene l'overlay del prodotto Car dovrebbe occuparsi di questo per te, puoi disabilitare il criterio del telefono in un overlay di risorse impostando enable_phone_policy su false in /packages/apps/Bluetooth/res/values/config.xml .

Utilizza la politica automobilistica predefinita

CarBluetoothService mantiene le autorizzazioni del profilo predefinito. L'elenco dei dispositivi noti e le priorità di riconnessione del profilo si trovano in service/src/com/android/car/BluetoothProfileDeviceManager.java .

Inoltre, la politica di gestione della connessione Bluetooth può essere trovata in service/src/com/android/car/BluetoothDeviceConnectionPolicy.java . Per impostazione predefinita, questo criterio definisce le istanze in cui Bluetooth deve connettersi e disconnettersi dai dispositivi collegati. Gestisce anche custodie specifiche per auto per quando l'adattatore deve essere acceso e spento.

Creazione della tua politica di gestione della connessione automobilistica personalizzata

Se la politica automobilistica predefinita non è sufficiente per le tue esigenze, può anche essere disabilitata a favore della tua politica personalizzata. Il criterio personalizzato sarà, come minimo, responsabile di determinare quando abilitare e disabilitare l'adattatore Bluetooth, nonché quando connettere i dispositivi. È possibile utilizzare una varietà di eventi per abilitare / disabilitare l'adattatore Bluetooth e per avviare le connessioni del dispositivo, inclusi gli eventi dovuti a modifiche nelle proprietà specifiche dell'auto.

Disattiva la politica automobilistica predefinita

Innanzitutto, per utilizzare una politica personalizzata, la politica automobilistica predefinita deve essere disabilitata impostando useDefaultBluetoothConnectionPolicy su false in una sovrapposizione di risorse . Questa risorsa è originariamente definita come parte di packages/services/Car/service/res/values/config.xml .

Abilita e disabilita l'adattatore Bluetooth

Una delle funzioni principali della tua politica è attivare e disattivare l'adattatore Bluetooth nei momenti appropriati. Puoi utilizzare le API framework BluetoothAdapter.enable() e BluetoothAdapter.disable() per abilitare e disabilitare l'adattatore. Queste chiamate dovrebbero rispettare lo stato persistente che l'utente ha selezionato tramite 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 will do nothing if the adapter
    // is already off, keeping the existing saved desired state for next reboot.
    bluetoothAdapter.disable(false);
}

Determina quando attivare e disattivare l'adattatore Bluetooth

Con la tua policy personalizzata sei libero di determinare quali eventi indicano i momenti migliori per abilitare e disabilitare l'adattatore. Un modo per farlo è utilizzare gli stati di alimentazione mantenuti da 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 will perceive 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;
        }
    }
};

Stabilisci quando connettere i dispositivi

Allo stesso modo, una volta determinati gli eventi che dovrebbero attivare le connessioni del dispositivo per iniziare, CarBluetoothManager fornisce la chiamata API connectDevices() che procederà alla connessione dei dispositivi in ​​base agli elenchi di priorità definiti per ciascun 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 application’s context
                Car car = Car.createCar(mContext);
                CarBluetoothManager carBluetoothManager =
                        (CarBluetoothManager) car.getCarManager(Car.BLUETOOTH_SERVICE);
                carBluetoothManager.connectDevices();
            }
        }
    }
}

Verifica della gestione della connessione automobilistica

Il modo più semplice per verificare il comportamento della tua politica di connessione è abilitare il Bluetooth sul tuo IVI 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 la tua politica automobilistica, la verifica di qualsiasi comportamento di connessione personalizzato richiederà il controllo degli eventi che hai scelto per attivare le connessioni del dispositivo.

Profili Bluetooth automobilistici

In Android, l'IVI può supportare più dispositivi collegati contemporaneamente tramite Bluetooth. I servizi telefonici Bluetooth multi-dispositivo consentono agli utenti di connettere dispositivi separati contemporaneamente, come un telefono personale e un telefono di lavoro, ed effettuare chiamate in vivavoce da entrambi i dispositivi.

I limiti di connessione vengono applicati da ogni singolo profilo Bluetooth, di solito nell'ambito dell'implementazione del servizio profili stesso. Per impostazione predefinita, CarBluetoothService non giudica ulteriormente il numero massimo di dispositivi collegati consentiti.

Profilo a mani libere

Il profilo vivavoce Bluetooth (HFP) consente al veicolo di effettuare e ricevere chiamate telefoniche tramite un dispositivo remoto connesso. Ogni connessione del dispositivo registra un account telefonico separato con TelecomManager , che annuncia eventuali account telefonici disponibili alle app IVI.

L'IVI può connettersi a più dispositivi tramite HFP. MAX_STATE_MACHINES_POSSIBLE in HeadsetClientService definisce il numero massimo di connessioni HFP simultanee.

Quando un utente effettua o riceve una telefonata da un dispositivo, l'account telefonico corrispondente crea un oggetto HfpClientConnection . L'app Dialer interagisce con l'oggetto HfpClientConnection per gestire le funzionalità di chiamata, come accettare una chiamata o riagganciare.

Va notato che l'app Dialer predefinita non supporta più dispositivi HFP connessi contemporaneamente. Per implementare HFP multi-dispositivo, è necessaria la personalizzazione per consentire agli utenti di selezionare l'account del dispositivo da utilizzare quando effettuano una chiamata. L'app chiamerà quindi telecomManager.placeCall con l'account corretto. Dovrai 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. Utilizzando il Bluetooth, connetti un dispositivo all'IVI e riproduci in streaming l'audio dal dispositivo.
  2. Collega due telefoni all'IVI tramite Bluetooth.
  3. Scegli un telefono. Effettua una chiamata in uscita direttamente dal telefono e una chiamata in uscita utilizzando l'IVI.
    1. Entrambe le volte, verifica che l'audio in streaming si interrompa e che l'audio del telefono venga riprodotto dagli altoparlanti collegati all'IVI.
  4. Utilizzando lo stesso telefono, ricevi una chiamata in arrivo direttamente sul telefono e ricevi una chiamata in arrivo utilizzando l'IVI.
    1. Entrambe le volte, verificare che l'audio in streaming si interrompa e che l'audio del telefono venga riprodotto dagli altoparlanti collegati all'IVI.
  5. Ripetere i passaggi 3 e 4 con l'altro telefono connesso.

Chiamate di emergenza

La possibilità di effettuare chiamate di emergenza è un aspetto importante della telefonia e delle funzioni Bluetooth dell'auto. Esistono diversi modi in cui è possibile avviare una chiamata di emergenza dall'IVI, tra cui:

  • Soluzione eCall autonoma
  • Soluzione eCall integrata nell'IVI
  • Affidarsi a un telefono Bluetooth connesso quando non è disponibile un sistema integrato

Collegamento di una chiamata di emergenza

Sebbene le apparecchiature eCall siano fondamentali per la sicurezza, attualmente non sono integrate 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 ulteriori informazioni, vedere Creazione di un'app di chiamata .

Ecco un esempio di come stabilire un 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.registerPhoneAcccount(account);
        mTelecomManager.enablePhoneAccount(account.getAccountHandle(), true);
    }
}

Abilitazione del Bluetooth per le chiamate di emergenza

La chiamata di emergenza prima di Android 10 comportava la composizione diretta da un telefono e il richiamo di apparecchiature speciali, se disponibili (ad es. Attivazione automatica al rilevamento di un pericolo o un'azione dell'utente). A partire da Android 10, il dialer in auto può chiamare direttamente un numero di emergenza, a condizione che questo codice sia contenuto 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 PBAP (Bluetooth Phone Book Access Profile) scarica i contatti e le cronologie delle chiamate da un dispositivo remoto connesso. PBAP mantiene un elenco di contatti aggregato e ricercabile che viene aggiornato dalla macchina a stati del client PBAP. Ogni dispositivo connesso interagisce con una macchina a stati client PBAP separata, con il risultato che i contatti vengono associati al dispositivo appropriato quando si effettua una chiamata.

PBAP è unidirezionale e quindi richiede che IVI installi le connessioni a qualsiasi dispositivo mobile desiderato. MAXIMUM_DEVICES in PbapClientService definisce il numero massimo di connessioni simultanee di dispositivi PBAP consentite con IVI. Il client PBAP memorizza i contatti per ogni dispositivo connesso nel Provider di contatti a cui può quindi accedere un'applicazione per ricavare la rubrica per ogni dispositivo.

Inoltre, la connessione del profilo deve essere autorizzata sia dall'IVI che dal dispositivo mobile per poter stabilire una connessione. Quando un client PBAP si disconnette, il database interno rimuove tutti i contatti e la cronologia delle chiamate associate al dispositivo precedentemente connesso.

Profilo di accesso ai messaggi

Il Bluetooth Message Access Profile (MAP) consente al veicolo di inviare e ricevere messaggi SMS tramite un dispositivo remoto connesso. Attualmente, i messaggi non vengono memorizzati localmente sull'IVI. Invece, ogni volta che il dispositivo remoto connesso riceve un messaggio, l'IVI riceve e analizza il messaggio e trasmette il suo contenuto in un Intent , che può quindi essere ricevuto da un'applicazione.

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 connessioni simultanee di dispositivi MAP consentite con IVI. Ogni connessione deve essere autorizzata dall'IVI e dal dispositivo mobile prima che i messaggi possano essere trasferiti.

Profilo di distribuzione audio avanzato

Il profilo di distribuzione audio avanzato Bluetooth (A2DP) consente al veicolo di ricevere flussi audio da un dispositivo remoto connesso.

A differenza di altri profili, il numero massimo di dispositivi A2DP collegati viene applicato nello stack nativo e non in Java. Il valore è attualmente codificato per 1 utilizzando il kDefaultMaxConnectedAudioDevices variabile /system/bt/vtif/src/btif_av.cc .

Profilo di controllo remoto audio / video

Il profilo di controllo remoto audio / video Bluetooth (AVRCP) consente al veicolo di controllare e sfogliare i lettori multimediali su un dispositivo remoto connesso. Poiché IVI svolge il ruolo di controller AVRCP, tutti i controlli attivati ​​che influenzano la riproduzione audio si basano su una connessione A2DP al dispositivo di destinazione.

Affinché un lettore multimediale specifico su un telefono Android possa essere sfogliato da IVI tramite AVRCP, l'applicazione multimediale sul telefono deve fornire un MediaBrowserService e consentire a com.android.bluetooth accesso a tale servizio. La creazione di un servizio di browser multimediale spiega come eseguire questa operazione in dettaglio.