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 Nutzerfreundlichkeit anderer Geräte und Dienste verbessern.
Bluetooth-Verbindungsverwaltung
In Android verwaltet CarBluetoothService die Bluetooth-Geräte des aktuellen Nutzers und die Prioritätslisten 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 gesteuert, die bei Bedarf mithilfe eines Ressourcen-Overlays überschrieben werden kann.
Verbindungsverwaltung für die Automobilbranche konfigurieren
Standardrichtlinie für Smartphones deaktivieren
Der Android-Bluetooth-Stack verwaltet eine Verbindungsrichtlinie für Smartphones, die standardmäßig aktiviert ist. Diese Richtlinie muss auf Ihrem Gerät deaktiviert sein, damit sie nicht mit der vorgesehenen Richtlinie für die Automobilbranche in
CarBluetoothService in Konflikt steht. Das sollte eigentlich durch das Produkt-Overlay für Autos erledigt werden. Sie können die Smartphone-Richtlinie aber auch in einem
Ressourcen-Overlay deaktivieren, indem Sie in
/packages/apps/Bluetooth/res/values/config.xml
unter MAXIMUM_CONNECTED_DEVICES
enable_phone_policy
auf false
festlegen.
Standardrichtlinie für die Automobilbranche verwenden
CarBluetoothService verwaltet die Berechtigungen für das Standardprofil. Eine Liste der bekannten Geräte und ihrer Prioritäten für die Profilwiederverbindung findest du unter service/src/com/android/car/BluetoothProfileDeviceManager.java
.
Außerdem finden Sie in
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
die Richtlinie zur Verwaltung von Bluetooth-Verbindungen. Standardmäßig definiert diese Richtlinie Fälle, in denen Bluetooth eine Verbindung zu gekoppelten Geräten herstellen und 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 Verbindungen für die Automobilbranche erstellen
Wenn die Standardrichtlinie für die Automobilbranche nicht Ihren Anforderungen entspricht, können Sie sie auch deaktivieren und durch eine benutzerdefinierte Richtlinie ersetzen. Ihre benutzerdefinierte Richtlinie legt mindestens fest, wann der Bluetooth-Adapter aktiviert und deaktiviert wird und wann Geräte verbunden werden. Es ist möglich, verschiedene Ereignisse zu verwenden, um den Bluetooth-Adapter zu aktivieren/deaktivieren und Geräteverbindungen zu initiieren, einschließlich Ereignisse aufgrund von Änderungen an bestimmten Fahrzeugeigenschaften.
Standardrichtlinie für die Automobilbranche deaktivieren
Wenn Sie eine benutzerdefinierte Richtlinie verwenden möchten, muss zuerst die Standardrichtlinie für die Automobilbranche 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 Hauptfunktionen Ihrer Richtlinie besteht darin, den Bluetooth-Adapter zur richtigen Zeit ein- und auszuschalten. Sie können die BluetoothAdapter.enable()
- und BluetoothAdapter.disable()
-Framework-APIs verwenden, um den Adapter zu aktivieren und zu deaktivieren.
Bei diesen Aufrufen muss der gespeicherte Status berücksichtigt werden, den der Nutzer über die Einstellungen oder auf andere Weise ausgewählt hat. So gehts:
/** * 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 festlegen, welche Ereignisse die besten Zeitpunkte für die Aktivierung und Deaktivierung des Adapters anzeigen. Eine Möglichkeit dazu ist die Verwendung der Betriebsmodi 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
Wenn Sie die Ereignisse festlegen, die die Geräteverbindungen auslösen sollen, bietet
CarBluetoothManager den connectDevices()
API-Aufruf, der die Geräteverbindungen basierend auf den für jedes Bluetooth-Profil definierten Prioritätslisten vornimmt.
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 die Automobilbranche prüfen
Am einfachsten kannst du das Verhalten deiner Verbindungsrichtlinie prüfen, indem du Bluetooth auf deinem IVI aktivierst und überprüfst, ob es automatisch in der richtigen Reihenfolge eine Verbindung zu den richtigen Geräten 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 können Sie mit der Ausgabe des folgenden Befehls Informationen zur Fehlerbehebung für Bluetooth-Verbindungen abrufen:
adb shell dumpsys car_service
Wenn Sie eine eigene Richtlinie für die Automobilbranche erstellt haben, müssen Sie zum Überprüfen des benutzerdefinierten Verbindungsverhaltens die Ereignisse steuern, die Sie zum Auslösen von Geräteverbindungen ausgewählt haben.
Bluetooth-Profile für die Automobilbranche
Unter Android kann die IVI mehrere Geräte unterstützen, die gleichzeitig über Bluetooth verbunden sind. Mit Bluetooth-Telefondiensten für mehrere Geräte können Nutzer mehrere Geräte gleichzeitig verbinden, z. B. ein privates Smartphone und ein geschäftliches Smartphone, und von beiden Geräten aus per Freisprecheinrichtung telefonieren.
Verbindungslimits werden von jedem einzelnen Bluetooth-Profil erzwungen, in der Regel innerhalb der Implementierung des Profildienstes selbst. Standardmäßig trifft CarBluetoothService keine weiteren Entscheidungen hinsichtlich der maximal zulässigen Anzahl verbundener Geräte.
Profil für Sprachbedienung
Mit dem Bluetooth-Freisprechprofil (HFP) können Sie über ein verbundenes Remote-Gerät Anrufe starten und entgegennehmen. Für jede Geräteverbindung wird ein separates Telefonkonto bei TelecomManager registriert, das alle verfügbaren Telefonkonten für die IVI-Apps anbietet.
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 einen Anruf von einem Gerät aus startet oder empfängt, wird vom entsprechenden Telefonkonto ein HfpClientConnection
-Objekt erstellt. Die Telefon-App interagiert mit dem HfpClientConnection
-Objekt, um Anruffunktionen wie das Annehmen oder Beenden eines Anrufs zu verwalten.
Die Standard-Telefon-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ätekonto bei einem Anruf verwendet werden soll. Die App ruft dann telecomManager.placeCall
mit dem richtigen Konto auf. Sie müssen prüfen, ob auch andere Funktionen für mehrere Geräte wie vorgesehen funktionieren.
HFP für mehrere Geräte prüfen
So prüfen Sie, ob die Verbindung mehrerer Geräte über Bluetooth richtig funktioniert:
- Verbinden Sie ein Gerät über Bluetooth mit dem IVI und streamen Sie Audio von diesem Gerät.
- Verbinden Sie zwei Smartphones über Bluetooth mit dem IVI.
- Wählen Sie ein Smartphone aus. Sie können einen ausgehenden Anruf direkt über das Telefon und über die IVI starten.
- Prüfen Sie in beiden Fällen, ob das gestreamte Audio pausiert und das Audio des Smartphones über die mit IVI verbundenen Lautsprecher wiedergegeben wird.
- Sie nehmen mit demselben Smartphone einen Anruf direkt auf dem Smartphone und einen Anruf über die IVI entgegen.
- Prüfen Sie in beiden Fällen, ob das gestreamte Audio pausiert und das Audio des Smartphones über die mit IVI verbundenen Lautsprecher wiedergegeben wird.
- Wiederholen Sie die Schritte 3 und 4 mit dem anderen verbundenen Smartphone.
Notrufe
Die Möglichkeit, Notrufe zu starten, ist ein wichtiger Aspekt der Telefon- und Bluetooth-Funktionen im Auto. Es gibt mehrere Möglichkeiten, einen Notruf über die IVI zu starten:
- Eigenständige eCall-Lösung
- In das IVI integrierte eCall-Lösung
- Ein verbundenes Bluetooth-Smartphone verwenden, wenn kein integriertes System verfügbar ist
Notruf starten
Obwohl eCall-Geräte sicherheitsrelevant sind, sind sie derzeit nicht in Android integriert. Mit ConnectionService können Sie Funktionen für Notrufe über Android verfügbar 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 für die Einrichtung eines Notfall- 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); } }
Bluetooth für Notrufe aktivieren
Vor Android 10 wurde der Notruf direkt über ein Smartphone gewählt und bei Bedarf spezielle Ausrüstung aktiviert (z. B. automatischer Auslöser bei Erkennen von Gefahren oder einer Nutzeraktion). Unter Android 10 und höher kann der Telefon-App im Auto eine Notrufnummer direkt angerufen werden, sofern diese 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>
Wenn Notrufe auf diese Weise implementiert werden, können auch andere Apps wie die Spracherkennung eine Notrufnummer anrufen.
Telefonbuchzugriffsprofil
Über das Bluetooth Phone Book Access Profile (PBAP) werden Kontakte und Anruflisten von einem verbundenen Remote-Gerät heruntergeladen. PBAP verwaltet eine aggregierte, suchbare Liste von Kontakten, die vom PBAP-Clientstatus-Manager aktualisiert wird. Jedes verbundene Gerät interagiert mit einem separaten PBAP-Client-Zustandsautomaten, wodurch Kontakte beim Anrufen dem richtigen Gerät zugeordnet werden.
PBAP ist unidirektional und erfordert daher, dass die IVI Verbindungen zu beliebigen MAXIMUM_CONNECTED_DEVICES
in
PbapClientService
definiert die maximale Anzahl gleichzeitiger PBAP-Geräteverbindungen, die mit der IVI zulässig sind. Der PBAP-Client speichert die Kontakte für jedes verbundene Gerät im
Kontakteanbieter, auf den eine App dann 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 die Verbindung eines PBAP-Clients getrennt wird, werden in der internen Datenbank alle Kontakte und die Anrufliste entfernt, die mit dem zuvor verbundenen Gerät verknüpft sind.
Message Access Profile
Mit dem Bluetooth Message Access Profile (MAP) kann das Fahrzeug SMS über ein verbundenes Remote-Gerät senden und empfangen. Derzeit werden Nachrichten nicht lokal auf dem IVI gespeichert. Stattdessen empfängt und analysiert die IVI die Nachricht, wenn das verbundene Remotegerät eine Nachricht empfängt, und überträgt den Inhalt in einer Intent-Instanz, die dann von einer App empfangen werden kann.
Damit eine Verbindung zu einem Mobilgerät zum Senden und Empfangen von Nachrichten hergestellt werden kann, 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
Mit dem Bluetooth Advanced Audio Distribution Profile (A2DP) kann das Fahrzeug Audiostreams von einem verbundenen Remote-Gerät empfangen.
Im Gegensatz zu anderen Profilen wird die maximale Anzahl der verbundenen A2DP-Geräte im nativen Stack und nicht in Java erzwungen. Der Wert ist derzeit mit 1
über die Variable kDefaultMaxConnectedAudioDevices
in
packages/modules/Bluetooth/system/btif/src/btif_av.cc
hartcodiert.
Audio/Video Remote Control Profile
Mit dem Bluetooth Audio/Video Remote Control Profile (AVRCP) können Sie über das Fahrzeug Medienplayer auf einem verbundenen Remote-Gerät steuern und durchsuchen. Da der IVI die Rolle eines AVRCP-Controllers spielt, erfordern alle ausgelösten Steuerelemente, die sich auf die Audiowiedergabe auswirken, eine A2DP-Verbindung zum Zielgerät.
Damit ein bestimmter Mediaplayer auf einem Android-Smartphone über AVRCP vom IVI durchsucht werden kann, muss die Media-App auf dem Smartphone einen
MediaBrowserService
bereitstellen und com.android.bluetooth
Zugriff auf diesen Dienst gewähren.
Medienbrowser-Dienst erstellen