Android bietet volles Bluetooth Implementierung mit Unterstützung vieler gängiger Bluetooth-Profile im Auto. Es gibt auch Verbesserungen für eine verbesserte Leistung und Nutzerfreundlichkeit mit anderen Geräten Dienstleistungen.
Verwaltung von Bluetooth-Verbindungen
Bei Android: CarBluetoothService behält die Bluetooth-Geräte und -Priorität des aktuellen Nutzers bei für jede Profilverbindung zum IVI. Geräte sind mit Profilen in einem Prioritätsreihenfolge definiert. Wann Geräte aktiviert, deaktiviert und mit einem Profil verbunden werden sollten: die von einer Standardverbindungsrichtlinie gesteuert wird, die durch die Verwendung eines Ressourcen-Overlay, wenn erwünscht ist.
Automotive-Verbindungsverwaltung konfigurieren
Standardmäßige Telefonrichtlinie deaktivieren
Der Android-Bluetooth-Stack verfügt über eine Verbindungsrichtlinie für Telefone, die durch
Standardeinstellung. Diese Richtlinie muss auf deinem Gerät deaktiviert sein, damit sie nicht mit dem
für die Automobilbranche
CarBluetoothService Das Auto-Produkt-Overlay sollte
diese Funktion zwar für Sie übernehmen,
können Sie die Telefonrichtlinie in einem
Ressourcen-Overlay durch Festlegen von enable_phone_policy
auf false
in
MAXIMUM_CONNECTED_DEVICES
in
/packages/apps/Bluetooth/res/values/config.xml
.
Standardrichtlinie für Autos verwenden
CarBluetoothService behält die Standardprofilberechtigungen bei. Die Liste der bekannten
Geräte und die Prioritäten für die Wiederverbindung des Profils befinden sich
service/src/com/android/car/BluetoothProfileDeviceManager.java
Die Richtlinie zur Bluetooth-Verbindungsverwaltung findest du auch unter
service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
. Standardmäßig
Mit dieser Richtlinie werden Instanzen definiert, in denen Bluetooth eine Verbindung zu gebundenen Verbindungen herstellen und trennen soll
Geräte. Außerdem lassen sich autospezifische Fälle verwalten, in denen der Adapter eingeschaltet und aktiviert werden sollte.
deaktiviert.
Eigene benutzerdefinierte Richtlinie für die Automotive-Verbindungsverwaltung erstellen
Wenn die Standardrichtlinie für Autos für Ihre Anforderungen nicht ausreicht, kann sie auch deaktiviert werden zugunsten deiner eigenen benutzerdefinierten Richtlinie. Ihre benutzerdefinierte Richtlinie muss zumindest um zu ermitteln, wann der Bluetooth-Adapter aktiviert und deaktiviert werden soll, Geräte verbinden. Die Bluetooth-Funktion kann anhand verschiedener Ereignisse aktiviert oder deaktiviert werden. und zum Initiieren von Geräteverbindungen, einschließlich Ereignissen aufgrund von Änderungen an bestimmten Autoeigenschaften.
Automotive-Standardrichtlinie deaktivieren
Um eine benutzerdefinierte Richtlinie zu verwenden, muss die Standardrichtlinie für Autos
useDefaultBluetoothConnectionPolicy
auf false
in einer
Ressourcen-Overlay.
Diese Ressource ist ursprünglich als Teil von definiert.
MAXIMUM_CONNECTED_DEVICES
in
packages/services/Car/service/res/values/config.xml
.
Bluetooth-Adapter aktivieren und deaktivieren
Eine der Hauptfunktionen Ihrer Richtlinie besteht darin, den Bluetooth-Adapter unter
zu den richtigen Zeitpunkten. Sie können die BluetoothAdapter.enable()
und
BluetoothAdapter.disable()
-Framework-APIs, um den Adapter zu aktivieren und zu deaktivieren.
Bei diesen Aufrufen sollte der beibehaltene Status berücksichtigt werden, den der Nutzer in den Einstellungen oder
auf andere Art und Weise. Eine Möglichkeit dafür ist so:
/** * 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 bestimmen, welche Ereignisse die besten Zeiten zur Durchführung von
den Adapter aktivieren und deaktivieren. Dazu können Sie z. B. die Energiezustände
MAXIMUM_CONNECTED_DEVICES
Zoll
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; } } };
Bestimmen, wann Geräte verbunden werden sollen
Ähnlich verhält es sich, wenn Sie die Ereignisse festlegen, die Geräteverbindungen zu
beginnen,
CarBluetoothManager stellt den connectDevices()
-API-Aufruf bereit, der
Geräte werden dann basierend auf den für jedes Bluetooth-Profil definierten Prioritätslisten verbunden.
Das ist beispielsweise sinnvoll, wenn der Bluetooth-Adapter eingeschaltet 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(); } } } }
Automotive-Verbindungsverwaltung prüfen
Die einfachste Möglichkeit, das Verhalten Ihrer Verbindungsrichtlinie zu überprüfen, besteht darin, Bluetooth zu aktivieren und überprüfe, ob die Verbindung automatisch mit den richtigen Geräten im geordnet werden. Sie können den Bluetooth-Adapter über die Benutzeroberfläche für die Einstellungen oder mit folgenden ADB-Befehlen:
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
Darüber hinaus kann die Ausgabe des folgenden Befehls verwendet werden, um Informationen zur Fehlerbehebung aufzurufen zu Bluetooth-Verbindungen:
adb shell dumpsys car_service
Wenn Sie Ihre eigene Automobilrichtlinie erstellt haben, überprüfen Sie alle benutzerdefinierten Verbindungen, müssen Sie die Ereignisse steuern, die Sie zum Auslösen des Geräts ausgewählt haben. Verbindungen.
Automotive-Bluetooth-Profile
Unter Android unterstützt das IVI mehrere gleichzeitig verbundene Geräte. über Bluetooth. Über Bluetooth-Telefondienste für mehrere Geräte können Nutzer eine Verbindung herstellen Geräte gleichzeitig trennen, wie ein privates und ein geschäftliches Telefon, Anrufe per Sprachbefehl von beiden Geräten aus.
Verbindungslimits werden von jedem einzelnen Bluetooth-Profil erzwungen, in der Regel innerhalb der Implementierung des Profildienstes selbst. Standardmäßig CarBluetoothService darf die maximale Anzahl von verbundenen Geräten nicht Geräte zugelassen sind.
Freisprechfunktion
Über das Bluetooth-Freisprecheinrichtungsprofil (Bluetooth Hands-Free Profile, HFP) kann das Fahrzeug Smartphone über ein verbundenes Remote-Gerät anrufen. Für jede Geräteverbindung wird ein separates Smartphone registriert Konto bei TelecomManager, die bei der IVI-App alle verfügbaren Telefonkonten bewirbt.
Der IVI kann sich per HFP mit mehreren Geräten verbinden. MAX_STATE_MACHINES_POSSIBLE
Mit MAXIMUM_CONNECTED_DEVICES
in
HeadsetClientService
ist die maximale Anzahl gleichzeitiger HFP-Werte definiert
Verbindungen.
Wenn ein Nutzer einen Anruf von einem Gerät tätigt oder empfängt, werden die entsprechenden
ein HfpClientConnection
-Objekt erstellt. Die Telefon App
interagiert mit dem HfpClientConnection
-Objekt, um den Aufruf zu verwalten
z. B. einen Anruf annehmen oder auflegen.
Beachten Sie, dass die Standard-Telefon-App nicht mehrere gleichzeitige Telefonfunktionen unterstützt.
verbundenen HFP-Geräten. Zur Implementierung von HFP für mehrere Geräte ist eine Anpassung erforderlich
, damit Nutzer auswählen können, welches Gerätekonto sie beim Telefonieren verwenden möchten. Die App
ruft telecomManager.placeCall
mit dem richtigen Konto auf. Erforderliche Schritte
Prüfen Sie, ob auch andere Funktionen für mehrere Geräte wie beabsichtigt funktionieren.
HFP für mehrere Geräte bestätigen
So prüfen Sie, ob die Verbindung für mehrere Geräte über Bluetooth ordnungsgemäß funktioniert:
- Verbinde ein Gerät über Bluetooth mit dem IVI und streame Audio vom .
- Verbinden Sie zwei Smartphones über Bluetooth mit dem IVI.
- Wähle ein Smartphone aus. Sie können direkt über das Smartphone anrufen,
und einen ausgehenden Anruf über den IVI tätigen.
- Prüfe in beiden Fällen, ob die gestreamten Audiopausen und der Ton des Telefons unterbrochen werden wird über IVI-verbundene Lautsprecher abgespielt.
- Wenn du dasselbe Smartphone verwendest, kannst du eingehende Anrufe direkt auf diesem Smartphone entgegennehmen.
einen eingehenden Anruf über IVI annehmen.
- Prüfe in beiden Fällen die Pausen des Audiostreams und die Smartphone-Audio wird über die mit IVI verbundenen Lautsprecher wiedergegeben.
- Wiederholen Sie die Schritte 3 und 4 mit dem anderen verbundenen Smartphone.
Notrufe
Die Möglichkeit, Notrufe abzusetzen, ist ein wichtiger Aspekt der Telefonie. Bluetooth-Funktionen im Auto Notrufe können auf verschiedene vom IVI eingeleitet werden, darunter:
- Eigenständige eCall-Lösung
- In IVI integrierte eCall-Lösung
- Verwendung eines verbundenen Bluetooth-Smartphones, wenn kein integriertes System verfügbar ist
Notruf absetzen
eCall-Geräte sind zwar sicherheitsrelevant, aber derzeit nicht in Android integriert. Es ist möglich, ConnectionService nutzen, um Notruffunktionen über Android bereitzustellen. der Einführung von Bedienungshilfen für Notrufe. Weitere Informationen finden Sie unter Anruf-App erstellen
Hier ist ein Beispiel für das Erstellen eines Notfalls ConnectionService übergeben:
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
Bei einem Notruf vor Android 10 wurde direkt von einem Smartphone aus gewählt und
spezielle Ausrüstung, falls verfügbar (z. B. automatisches Auslösen bei Gefahrenerkennung oder
Nutzeraktion). Ab Android 10 kann die Telefon App im Auto direkt eine
Notrufnummer, 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 Sie die Notruffunktion auf diese Weise einrichten, können andere Apps, wie z. B. die Spracherkennung, auch eine Notrufnummer wählen.
Telefonbuchzugriffsprofil
Das Bluetooth Phone Book Access Profile (PBAP) lädt Kontakte und Anrufverläufe herunter. von einem verbundenen Remote-Gerät empfangen. PBAP pflegt eine zusammengefasste, durchsuchbare Liste Kontakte, die vom PBAP-Client-Statuscomputer aktualisiert werden. Jedes verbundene Gerät interagiert mit einem separaten PBAP-Client-Statuscomputer, was dazu führt, dass die mit dem richtigen Gerät verknüpft sind.
PBAP ist unidirektional und erfordert daher, dass IVI Verbindungen zu beliebigen
MAXIMUM_CONNECTED_DEVICES
Zoll
PbapClientService
definiert die maximale Anzahl gleichzeitiger PBAP-Geräte
Verbindungen mit dem IVI zugelassen. Der PBAP-Client speichert die Kontakte für jede
verbundenes Gerät im
Kontakte-Anbieter, auf den dann eine App zugreifen kann, um
Buch für jedes Gerät.
Außerdem muss die Profilverbindung sowohl vom IVI als auch vom Mobilgerät verknüpft, damit eine Verbindung hergestellt werden kann. Wenn ein PBAP-Client die Verbindung trennt, entfernt die interne Datenbank alle Kontakte und die Anrufliste, die mit der zuvor verbundenes Gerät.
Message Access Profile
Über das Bluetooth Message Access Profile (MAP) kann das Fahrzeug SMS senden und empfangen Nachrichten über ein verbundenes Remote-Gerät verschicken können. Derzeit werden Nachrichten nicht lokal auf der IVI. Immer wenn das angeschlossene Remote-Gerät eine Nachricht empfängt, empfängt und analysiert die Nachricht und sendet ihren Inhalt in einer Intent-Instanz die von einer App empfangen werden können.
Wird zum Herstellen einer Verbindung mit einem Mobilgerät zum Senden und Empfangen von Nachrichten
muss der IVI die MAP-Verbindung herstellen.
MAXIMUM_CONNECTED_DEVICES
in
MapClientService
definiert die maximale Anzahl gleichzeitiger MAP-Geräte
Verbindungen mit dem IVI zugelassen. Jede Verbindung muss vom IVI und vom
bevor Nachrichten übertragen werden können.
Advanced Audio Distribution-Profil
Über das Bluetooth Advanced Audio Distribution Profile (A2DP) kann das Fahrzeug Audiostreams von einem verbundenen Remote-Gerät
Im Gegensatz zu anderen Profilen wird die maximale Anzahl verbundener A2DP-Geräte in der
native Stacks und nicht in Java. Der Wert ist derzeit hartcodiert in 1
mithilfe von
Variable kDefaultMaxConnectedAudioDevices
in
packages/modules/Bluetooth/system/btif/src/btif_av.cc
Audio/Video Remote Control-Profil
Über das Bluetooth Audio/Video Remote Control Profile (AVRCP) kann das Fahrzeug und auf einem verbundenen Remote-Gerät nach Mediaplayern suchen. Da der IVI die Rolle eines einen AVRCP-Controller, erfordern alle ausgelösten Steuerelemente, die die Audiowiedergabe beeinflussen, ein A2DP Verbindung zum Zielgerät.
Damit ein bestimmter Mediaplayer auf einem Android-Smartphone vom IVI über AVRCP durchsucht werden kann,
muss die Medien-App auf dem Smartphone
MediaBrowserService
und com.android.bluetooth
den Zugriff erlauben auf
für diesen Dienst.
In diesem Artikel wird die Erstellung eines Medienbrowser-Dienstes im Detail erläutert.