Android bietet eine vollständige Bluetooth-Implementierung mit Unterstützung für viele gängige Bluetooth-Profile für Autos. Außerdem gibt es viele Verbesserungen, die die Leistung und Nutzung auf anderen Geräten und in anderen Diensten optimieren.
Bluetooth-Verbindungen verwalten
In Android verwaltet CarBluetoothService die Bluetooth-Geräte und Prioritätslisten des aktuellen Nutzers für jede Profilverbindung zum IVI. Geräte werden in einer definierten Prioritätsreihenfolge mit Profilen verbunden. Wann Geräte aktiviert, deaktiviert und mit einem Profil verbunden werden, wird durch eine Standardverbindungsrichtlinie bestimmt, die bei Bedarf mit einem Ressourcen-Overlay überschrieben werden kann.
Verbindungsverwaltung für Fahrzeuge konfigurieren
Standardrichtlinie für Smartphones deaktivieren
Der Android-Bluetooth-Stack verwaltet eine standardmäßig aktivierte Verbindungsrichtlinie für Smartphones. Diese Richtlinie muss auf Ihrem Gerät deaktiviert sein, damit sie nicht mit der beabsichtigten Autorichtlinie in
CarBluetoothService in Konflikt gerät. Das Car-Produkt-Overlay sollte dies für Sie übernehmen. Sie können die Smartphone-Richtlinie jedoch in einem
Ressourcen-Overlay deaktivieren, indem Sie enable_phone_policy
in MAXIMUM_CONNECTED_DEVICES
in
/packages/apps/Bluetooth/res/values/config.xml
auf false
setzen.
Standardrichtlinie für Automotive verwenden
CarBluetoothService behält die Standardprofilberechtigungen bei. Die Liste der bekannten Geräte und ihrer Prioritäten für die erneute Profilverbindung finden Sie unter service/src/com/android/car/BluetoothProfileDeviceManager.java
.
Die Richtlinie zur Verwaltung von Bluetooth-Verbindungen finden Sie unter
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
. Standardmäßig werden mit dieser Richtlinie die Fälle definiert, in denen Bluetooth eine Verbindung zu gekoppelten Geräten herstellen und die Verbindung zu gekoppelten Geräten trennen soll. Außerdem werden fahrzeugspezifische Fälle verwaltet, in denen der Adapter ein- und ausgeschaltet werden soll.
Benutzerdefinierte Richtlinie für die Verwaltung von Automotive-Verbindungen erstellen
Wenn die Standardrichtlinie für Autos nicht Ihren Anforderungen entspricht, kann sie auch zugunsten Ihrer eigenen benutzerdefinierten Richtlinie deaktiviert werden. Ihre benutzerdefinierte Richtlinie ist mindestens dafür verantwortlich, wann der Bluetooth-Adapter aktiviert und deaktiviert und wann eine Verbindung zu Geräten hergestellt werden soll. Es ist möglich, verschiedene Ereignisse zu verwenden, um den Bluetooth-Adapter zu aktivieren/deaktivieren und Geräteverbindungen herzustellen, einschließlich Ereignissen aufgrund von Änderungen bestimmter Fahrzeugeigenschaften.
Standardrichtlinie für Automotive deaktivieren
Wenn Sie eine benutzerdefinierte Richtlinie verwenden möchten, muss zuerst die Standardrichtlinie für Autos deaktiviert werden. Dazu müssen Sie in einem Ressourcen-Overlay useDefaultBluetoothConnectionPolicy
auf false
festlegen.
Diese Ressource ist ursprünglich als Teil von MAXIMUM_CONNECTED_DEVICES
in
packages/services/Car/service/res/values/config.xml
definiert.
Bluetooth-Adapter aktivieren und deaktivieren
Eine der Kernfunktionen Ihrer Richtlinie besteht darin, den Bluetooth-Adapter zu den entsprechenden Zeiten ein- und auszuschalten. Mit den Framework-APIs BluetoothAdapter.enable()
und BluetoothAdapter.disable()
können Sie den Adapter aktivieren und deaktivieren.
Bei diesen Aufrufen sollte der vom Nutzer über die Einstellungen oder auf andere Weise ausgewählte Status berücksichtigt werden. Eine Möglichkeit dazu:
/** * 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); }
Festlegen, wann der Bluetooth-Adapter ein- und ausgeschaltet werden soll
Mit Ihrer benutzerdefinierten Richtlinie können Sie selbst festlegen, bei welchen Ereignissen der Adapter aktiviert und deaktiviert werden soll. Eine Möglichkeit hierfür ist die Verwendung der Energiestatus 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; } } };
Festlegen, wann Geräte verbunden werden sollen
Wenn Sie festlegen, welche Ereignisse Geräteverbindungen auslösen sollen, stellt
CarBluetoothManager den connectDevices()
-API-Aufruf bereit, mit dem Geräte basierend auf den für jedes Bluetooth-Profil definierten Prioritätslisten verbunden werden.
Ein Beispiel dafür ist, wenn der Bluetooth-Adapter aktiviert wird:
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(); } } } }
Verbindungsverwaltung für Fahrzeuge prüfen
Am einfachsten lässt sich das Verhalten Ihrer Verbindungsrichtlinie überprüfen, indem Sie Bluetooth auf Ihrem IVI-System aktivieren und prüfen, ob es automatisch eine Verbindung zu den richtigen Geräten in der richtigen Reihenfolge herstellt. Sie können den Bluetooth-Adapter über die Einstellungen oder mit den folgenden ADB-Befehlen aktivieren oder deaktivieren:
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
Außerdem kann die Ausgabe des folgenden Befehls verwendet werden, um Debugging-Informationen zu Bluetooth-Verbindungen zu sehen:
adb shell dumpsys car_service
Wenn Sie eine eigene Automotive-Richtlinie erstellt haben, müssen Sie die Ereignisse steuern, die Geräteverbindungen auslösen, um benutzerdefiniertes Verbindungsverhalten zu überprüfen.
Bluetooth-Profile für Kraftfahrzeuge
Unter Android kann das IVI mehrere Geräte gleichzeitig über Bluetooth unterstützen. Mit Bluetooth-Telefondiensten für mehrere Geräte können Nutzer separate Geräte gleichzeitig verbinden, z. B. ein privates und ein geschäftliches Smartphone, und von beiden Geräten aus Freisprechanrufe tätigen.
Verbindungslimits werden von jedem einzelnen Bluetooth-Profil durchgesetzt, in der Regel innerhalb der Implementierung des Profildienstes selbst. Standardmäßig trifft CarBluetoothService keine weiteren Entscheidungen über die maximal zulässige Anzahl verbundener Geräte.
Hands-Free Profile
Das Bluetooth Hands-Free Profile (HFP) ermöglicht es dem Fahrzeug, über ein verbundenes externes Gerät Telefonanrufe zu starten und entgegenzunehmen. Bei jeder Geräteverbindung wird ein separates Telefonkonto bei TelecomManager registriert, das alle verfügbaren Telefonkonten für die IVI-Apps bewirbt.
Das IVI kann über HFP eine Verbindung zu mehreren Geräten herstellen. MAX_STATE_MACHINES_POSSIBLE
MAXIMUM_CONNECTED_DEVICES
in
HeadsetClientService
definiert die maximale Anzahl gleichzeitiger HFP-Verbindungen.
Wenn ein Nutzer über ein Gerät einen Anruf startet oder entgegennimmt, wird im entsprechenden Telefonkonto ein HfpClientConnection
-Objekt erstellt. Die Dialer App interagiert mit dem HfpClientConnection
-Objekt, um Anruffunktionen wie das Annehmen oder Beenden eines Anrufs zu verwalten.
Die Standard-Wähl-App unterstützt nicht mehrere gleichzeitig verbundene HFP-Geräte. Für die Implementierung von HFP für mehrere Geräte ist eine Anpassung erforderlich, damit Nutzer auswählen können, welches Geräte-Konto für einen Anruf verwendet werden soll. Die App ruft dann telecomManager.placeCall
mit dem richtigen Konto auf. Sie müssen auch überprüfen, ob andere Funktionen für mehrere Geräte wie vorgesehen funktionieren.
Multi-Device-HFP überprüfen
So prüfen Sie, ob die Verbindung mit mehreren Geräten über Bluetooth ordnungsgemäß funktioniert:
- Verbinden Sie ein Gerät über Bluetooth mit dem IVI und streamen Sie Audioinhalte vom Gerät.
- Zwei Smartphones über Bluetooth mit dem IVI verbinden
- Wählen Sie ein Smartphone aus. Tätigen Sie einen ausgehenden Anruf direkt über das Smartphone und über das IVI.
- Prüfen Sie in beiden Fällen, ob die Audioübertragung pausiert wird und die Audioausgabe des Smartphones über die mit dem IVI verbundenen Lautsprecher erfolgt.
- Nehmen Sie mit demselben Smartphone einen eingehenden Anruf direkt auf dem Smartphone und einen eingehenden Anruf über das IVI entgegen.
- Prüfen Sie beide Male, ob die Audiowiedergabe pausiert wird und die Audioausgabe des Smartphones über die mit dem IVI verbundenen Lautsprecher erfolgt.
- Wiederholen Sie die Schritte 3 und 4 mit dem anderen verbundenen Smartphone.
Notrufe
Die Möglichkeit, Notrufe zu tätigen, ist ein wichtiger Aspekt der Telefonie- und Bluetooth-Funktionen im Auto. Ein Notruf kann auf verschiedene Arten über das IVI-System ausgelöst werden, z. B. durch:
- Eigenständige eCall-Lösung
- In das IVI integrierte eCall-Lösung
- Verwendung eines verbundenen Bluetooth-Smartphones, wenn kein integriertes System verfügbar ist
Notruf herstellen
eCall-Geräte sind sicherheitskritisch, aber derzeit nicht in Android integriert. Es ist möglich, ConnectionService zu verwenden, um Notruffunktionen über Android verfügbar zu machen. Dies hat auch den Vorteil, dass Bedienungshilfen für Notrufe eingeführt werden. Weitere Informationen finden Sie unter Anruf-App erstellen.
Hier ist ein Beispiel dafür, wie Sie einen ConnectionService für Notfälle einrichten:
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); } }
Bluetooth für Notrufe aktivieren
Vor Android 10 musste der Notruf direkt über ein Smartphone gewählt werden. Falls verfügbar, wurde spezielle Ausrüstung aktiviert, z. B. eine automatische Auslösung bei Gefahr oder eine Nutzeraktion. Unter Android 10 und höher kann über die Wähl-App im Auto direkt eine Notrufnummer angerufen werden, sofern 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>
Durch die Implementierung von Notrufen auf diese Weise können auch andere Apps, z. B. Spracherkennung, eine Notrufnummer anrufen.
Phone Book Access Profile
Über das Bluetooth Phone Book Access Profile (PBAP) werden Kontakte und Anruflisten von einem verbundenen Remote-Gerät heruntergeladen. PBAP verwaltet eine aggregierte, durchsuchbare Liste von Kontakten, die von der PBAP-Client-Zustandsmaschine aktualisiert wird. Jedes verbundene Gerät interagiert mit einem separaten PBAP-Client-Zustandsautomaten. Dadurch werden Kontakte beim Tätigen eines Anrufs dem richtigen Gerät zugeordnet.
PBAP ist unidirektional und erfordert daher, dass das IVI Verbindungen zu allen MAXIMUM_CONNECTED_DEVICES
instanziiert.
PbapClientService
definiert die maximale Anzahl gleichzeitiger PBAP-Geräteverbindungen, die mit dem IVI zulässig sind. Der PBAP-Client speichert die Kontakte für jedes verbundene Gerät im
Kontakte-Provider, auf den eine App zugreifen kann, um das Telefonbuch für jedes Gerät abzuleiten.
Außerdem muss die Profilverbindung sowohl vom IVI als auch vom Mobilgerät autorisiert werden, damit eine Verbindung hergestellt werden kann. Wenn ein PBAP-Client die Verbindung trennt, werden alle Kontakte und die Anrufliste, die mit dem zuvor verbundenen Gerät verknüpft sind, aus der internen Datenbank entfernt.
Message Access Profile
Das Bluetooth Message Access Profile (MAP) ermöglicht es dem Fahrzeug, SMS-Nachrichten über ein verbundenes externes Gerät zu senden und zu empfangen. Derzeit werden Nachrichten nicht lokal auf dem IVI gespeichert. Stattdessen empfängt und parst das IVI jedes Mal, wenn das verbundene Remote-Gerät eine Nachricht empfängt, die Nachricht und überträgt ihren Inhalt in einer Intent-Instanz, die dann von einer App empfangen werden kann.
Um eine Verbindung zu einem Mobilgerät herzustellen, um Nachrichten zu senden und zu empfangen, muss das IVI die MAP-Verbindung initiieren.
MAXIMUM_CONNECTED_DEVICES
in
MapClientService
definiert die maximale Anzahl gleichzeitiger MAP-Geräteverbindungen, die mit dem IVI zulässig sind. Jede Verbindung muss vom IVI und vom Mobilgerät autorisiert werden, bevor Nachrichten übertragen werden können.
Advanced Audio Distribution Profile
Das Bluetooth Advanced Audio Distribution Profile (A2DP) ermöglicht es dem Fahrzeug, Audio-Streams von einem verbundenen Remote-Gerät zu empfangen.
Im Gegensatz zu anderen Profilen wird die maximale Anzahl verbundener A2DP-Geräte im nativen Stack und nicht in Java erzwungen. Der Wert ist derzeit mit der Variablen kDefaultMaxConnectedAudioDevices
in
packages/modules/Bluetooth/system/btif/src/btif_av.cc
auf 1
festgelegt.
Audio/Video Remote Control Profile
Das Bluetooth-Profil „Audio/Video Remote Control Profile“ (AVRCP) ermöglicht es dem Fahrzeug, Media-Player auf einem verbundenen Remote-Gerät zu steuern und zu durchsuchen. Da das IVI die Rolle eines AVRCP-Controllers übernimmt, ist für alle ausgelösten Steuerelemente, die sich auf die Audiowiedergabe auswirken, eine A2DP-Verbindung zum Zielgerät erforderlich.
Damit ein bestimmter Media-Player auf einem Android-Smartphone über AVRCP vom IVI durchsucht werden kann, muss die Media-App auf dem Smartphone eine
MediaBrowserService
bereitstellen und com.android.bluetooth
Zugriff auf diesen Dienst gewähren.
Medienbrowser-Dienst erstellen enthält eine detaillierte Anleitung dazu.