für Bluetooth

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:

  1. Verbinde ein Gerät über Bluetooth mit dem IVI und streame Audio vom .
  2. Verbinden Sie zwei Smartphones über Bluetooth mit dem IVI.
  3. Wähle ein Smartphone aus. Sie können direkt über das Smartphone anrufen, und einen ausgehenden Anruf über den IVI tätigen.
    1. Prüfe in beiden Fällen, ob die gestreamten Audiopausen und der Ton des Telefons unterbrochen werden wird über IVI-verbundene Lautsprecher abgespielt.
  4. Wenn du dasselbe Smartphone verwendest, kannst du eingehende Anrufe direkt auf diesem Smartphone entgegennehmen. einen eingehenden Anruf über IVI annehmen.
    1. Prüfe in beiden Fällen die Pausen des Audiostreams und die Smartphone-Audio wird über die mit IVI verbundenen Lautsprecher wiedergegeben.
  5. 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.