Bluetooth

Android zapewnia pełną obsługę Bluetootha z obsługą wielu popularnych profili Bluetooth w samochodach. Dostępne są także wiele ulepszeń poprawiających wydajność i komfort obsługi na innych urządzeniach. usług Google.

Zarządzanie połączeniami Bluetooth

W systemie Android CarBluetoothService utrzymuje urządzenia Bluetooth i priorytety bieżącego użytkownika. dla każdego połączenia profilu z IVI. Urządzenia są połączone z profilami w według ustalonego priorytetu. Kiedy włączać, wyłączać i łączyć urządzenia z profilem, to na podstawie domyślnej zasady połączenia, którą można zastąpić za pomocą nakładka zasobów, jeśli pożądaną.

Skonfiguruj zarządzanie połączeniami w samochodach

Wyłączanie domyślnych zasad dotyczących telefonu

Stos Bluetootha na Androidzie utrzymuje zasady połączeń dla telefonów, które są włączone przez wartość domyślną. Ta zasada musi być wyłączona na urządzeniu, aby uniknąć konfliktu z zasadą zamierzone zasady dotyczące pojazdów w CarBluetoothService Możesz zrobić to dzięki nakładce na produkt samochodowy, możesz wyłączyć zasady dotyczące telefonu w nakładka zasobów przez ustawienie enable_phone_policy na false w MAXIMUM_CONNECTED_DEVICES w /packages/apps/Bluetooth/res/values/config.xml.

Użyj domyślnych zasad dotyczących samochodów

CarBluetoothService zachowuje domyślne uprawnienia profilu. Lista znanych funkcji urządzeń i priorytetów ponownego łączenia profili service/src/com/android/car/BluetoothProfileDeviceManager.java

Zasady zarządzania połączeniami Bluetooth znajdziesz też w service/src/com/android/car/BluetoothDeviceConnectionPolicy.java. Domyślnie ta zasada określa instancje, w których Bluetooth ma nawiązywać połączenie i się od niego rozłączać urządzenia. Obsługuje również przypadki włączania i wyłączania ładowarki w konkretnych samochodach. wyłączone.

Tworzenie własnych niestandardowych zasad zarządzania połączeniami w samochodach

Jeśli domyślna zasada dotycząca motoryzacji nie wystarcza do Twoich potrzeb, możesz ją wyłączyć na własne, niestandardowe zasady. Odpowiedzialność powinna być każda niestandardowa zasada który pozwala określić, kiedy włączyć i wyłączyć adapter Bluetooth oraz kiedy podłącz urządzenia. Bluetooth można włączać i wyłączać przy użyciu różnych zdarzeń i inicjowanie połączeń z urządzeniami, w tym zdarzeń związanych ze zmianami określonych właściwości samochodu.

Wyłącz domyślną zasadę dotyczącą motoryzacji

Po pierwsze, aby można było używać zasady niestandardowej, domyślne zasady dotyczące motoryzacji muszą być wyłączone przez ustawiam wartość useDefaultBluetoothConnectionPolicy na false w nakładka zasobów. Ten zasób został pierwotnie zdefiniowany jako część MAXIMUM_CONNECTED_DEVICES w packages/services/Car/service/res/values/config.xml.

Włączanie i wyłączanie adaptera Bluetooth

Jedną z podstawowych funkcji zasad jest włączanie i wyłączanie adaptera Bluetooth w: we właściwym czasie. Za pomocą BluetoothAdapter.enable() oraz Interfejsy API platformy BluetoothAdapter.disable() do włączania i wyłączania adaptera. Te wywołania powinny uwzględniać stan ustalony przez użytkownika w ustawieniach lub w żaden inny sposób. Aby to zrobić:

/**
 * 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);
}

Określ, kiedy włączyć, a kiedy włączyć i wyłączyć adapter Bluetooth

W przypadku własnych zasad możesz swobodnie określać, które wydarzenia wskazują najlepsze pory włączyć i wyłączyć adapter. Można to zrobić na przykład przez wykorzystanie stanów zasilania 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;
        }
    }
};

Określ, kiedy należy połączyć urządzenia

Podobnie, gdy określisz zdarzenia, które powinny aktywować połączenia urządzeń z początek, CarBluetoothManager udostępnia wywołanie interfejsu API connectDevices(), które przechodzi do łączenia urządzeń na podstawie list priorytetów zdefiniowanych dla każdego profilu Bluetooth.

Przykładem może być za każdym razem, gdy włącza się adapter Bluetooth:

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();
            }
        }
    }
}

Sprawdzanie zarządzania połączeniami samochodowymi

Najprostszym sposobem na sprawdzenie działania zasady połączenia jest włączenie Bluetootha IVI i sprawdź, czy automatycznie łączy się z właściwymi urządzeniami w odpowiedniej kolejności. Adapter Bluetooth możesz włączyć w interfejsie ustawień lub te polecenia 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

Dodatkowo dane wyjściowe tego polecenia pozwalają wyświetlić informacje o debugowaniu: związane z połączeniami Bluetooth:

adb shell dumpsys car_service

Jeśli masz własną zasadę dotyczącą motoryzacji, sprawdź też niestandardowe połączenie. wymaga sterowania zdarzeniami, które mają aktywować urządzenie połączeń.

Motoryzacja – profile Bluetooth

W przypadku Androida system IVI obsługuje wiele urządzeń połączonych jednocześnie przez Bluetooth. Usługi Bluetooth dla wielu urządzeń umożliwiają użytkownikom łączenie się urządzenia jednocześnie (np. telefon prywatny i służbowy) oraz rozmowy w trybie głośnomówiącym z dowolnego urządzenia.

Limity połączeń są egzekwowane przez każdy profil Bluetooth, zwykle i wdrożenie samej usługi profilu. Domyślnie CarBluetoothService nie ocenia w żaden sposób maksymalnej liczby urządzeń.

Profil obsługi bez użycia rąk

Profil HFP Bluetooth umożliwia nawiązywanie i odbieranie telefonu przez pojazd. za pomocą połączonego urządzenia zdalnego. Każde połączenie z urządzeniem powoduje zarejestrowanie osobnego telefonu konto z TelecomManager, który reklamuje wszystkie dostępne konta telefoniczne w aplikacjach IVI.

IVI może łączyć się z wieloma urządzeniami przez HFP. MAX_STATE_MACHINES_POSSIBLE Pole MAXIMUM_CONNECTED_DEVICES w HeadsetClientService określa maksymalną liczbę jednoczesnych HFP połączeń.

Gdy użytkownik nawiązuje lub odbiera połączenie telefoniczne z urządzenia, powiązane z konto telefonu tworzy obiekt HfpClientConnection. Aplikacja Telefon wchodzi w interakcję z obiektem HfpClientConnection w celu zarządzania wywołaniem funkcje takie jak odbieranie połączenia czy rozłączanie się.

Należy pamiętać, że domyślna aplikacja Telefon nie obsługuje wielu jednocześnie. podłączonych urządzeniach HFP. Wdrożenie funkcji HFP na wielu urządzeniach wymaga dostosowania. aby umożliwić użytkownikom wybór konta na urządzeniu, które mają być używane podczas nawiązywania połączeń. Następnie aplikacja Wywołuje funkcję telecomManager.placeCall z właściwym kontem. Czynności, które musisz wykonać Sprawdź, czy inne funkcje działające na różnych urządzeniach również działają poprawnie.

Zweryfikuj HFP na wielu urządzeniach

Aby sprawdzić, czy łączność między wieloma urządzeniami działa prawidłowo przez Bluetooth:

  1. Przez Bluetooth należy połączyć urządzenie z IVI i przesyłać strumieniowo dźwięk z urządzenia.
  2. Połącz dwa telefony z IVI przez Bluetooth.
  3. Wybierz jeden telefon. wykonywać połączenia wychodzące bezpośrednio z telefonu, i nawiąż połączenie wychodzące za pomocą IVI.
    1. W obu przypadkach sprawdź wstrzymania odtwarzania strumieniowego dźwięku i dźwięk telefonu będzie odtwarzany na głośnikach połączonych IVI.
  4. odbierasz połączenie przychodzące na tym samym telefonie bezpośrednio na telefonie; odebranie połączenia przychodzącego za pomocą IVI
    1. W obu przypadkach sprawdź przerwy w odtwarzaniu dźwięku i dźwięk z telefonu jest odtwarzany przez głośniki podłączone do IVI.
  5. Powtórz kroki 3 i 4 na drugim połączonym telefonie.

Połączenia alarmowe

Możliwość wykonywania połączeń alarmowych jest ważnym aspektem usług telefonicznych. Funkcje Bluetooth w samochodzie. Połączenie alarmowe może być zainicjowane przez IVI, w tym:

  • Oddzielne rozwiązanie eCall
  • Rozwiązanie eCall zintegrowane z IVI
  • Korzystanie z połączonego telefonu Bluetooth, gdy nie ma dostępnego wbudowanego systemu

Nawiąż połączenie alarmowe

Sprzęt do obsługi e-maili ma kluczowe znaczenie dla bezpieczeństwa, ale obecnie nie jest zintegrowany z Androidem. Możesz skorzystać z ConnectionService, aby udostępniać funkcje połączeń alarmowych na Androidzie, które mają również korzyści wynikające z wprowadzenia opcji ułatwień dostępu w przypadku połączeń alarmowych. Więcej informacji: Tworzę aplikację do rozmów.

Oto przykład sytuacji alarmowej ConnectionService (Usługa połączenia):

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);
    }
}

Włącz Bluetooth do połączeń alarmowych

Połączenie alarmowe przed Androidem 10 obejmuje bezpośrednie wybieranie numerów z telefonu i wywoływanie sprzęt specjalny (np. automatyczne uruchomienie po wykryciu zagrożenia lub działanie użytkownika). W Androidzie 10 i nowszych Telefon w samochodzie może bezpośrednio nawiązywać połączenia numer alarmowy, podawany MAXIMUM_CONNECTED_DEVICES w 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>

Dzięki wdrożeniu w ten sposób połączeń alarmowych inne aplikacje, takie jak rozpoznawanie głosu, mogą też zadzwonić pod numer alarmowy.

Profil dostępu do książki telefonicznej

Profil dostępu do książki telefonicznej przez Bluetooth (PBAP) pobiera kontakty i historię połączeń z połączonego urządzenia zdalnego. PBAP przechowuje zagregowaną, przeszukiwalną listę kontakty aktualizowane przez maszynę stanu klienta PBAP. Każde połączone urządzenie współpracuje z osobną maszyną stanu klienta PBAP, przez co kontakty są związane z odpowiednim urządzeniem.

PBAP działa jednokierunkowo i dlatego wymaga, aby IVI utworzyły wystąpienia połączeń MAXIMUM_CONNECTED_DEVICES in PbapClientService określa maksymalną liczbę jednoczesnych urządzeń PBAP dozwolonych połączeń z IVI. Klient PBAP przechowuje kontakty dla każdej połączonych urządzeń w Dostawca kontaktów, do którego aplikacja może uzyskać dostęp do telefonu na każdym urządzeniu.

Dodatkowo połączenie z profilem musi być autoryzowane przez IVI oraz za pomocą urządzenia mobilnego. Po rozłączeniu klienta PBAP wewnętrzna baza danych usuwa wszystkie kontakty i historię połączeń Wcześniej połączone urządzenie.

Profil dostępu do wiadomości

Profil dostępu do wiadomości przez Bluetooth (MAP) umożliwia wysyłanie i odbieranie SMS-ów w pojeździe za pośrednictwem połączonego urządzenia zdalnego. Obecnie wiadomości nie są przechowywane lokalnie w IVI. Zamiast tego za każdym razem, gdy połączone urządzenie zdalne odbierze wiadomość, IVI odbiera i analizuje wiadomość oraz przesyła jej treść intencji, który może być potem odbierany przez aplikację.

Aby połączyć się z urządzeniem mobilnym w celu wysyłania i odbierania wiadomości IVI musi zainicjować połączenie MAP. Parametr MAXIMUM_CONNECTED_DEVICES w MapClientService określa maksymalną liczbę jednoczesnych urządzeń MAP dozwolonych połączeń z IVI. Każde połączenie musi być autoryzowane przez IVI oraz na urządzeniu mobilnym.

Profil zaawansowanej dystrybucji dźwięku

Profil A2DP (Bluetooth Advanced Audio Distribution Profile) umożliwia strumienie audio z połączonego urządzenia zdalnego.

W przeciwieństwie do innych profili maksymalna liczba podłączonych urządzeń A2DP jest wymuszana w natywnym stosem, a nie w Javie. Wartość jest obecnie zakodowana na stałe jako 1 za pomocą funkcji zmienną kDefaultMaxConnectedAudioDevices w argumencie packages/modules/Bluetooth/system/btif/src/btif_av.cc

Profil pilota audio/wideo

Profil zdalnego sterowania Bluetooth Audio/Video (AVRCP) umożliwia sterowanie pojazdem. i przeglądać odtwarzacze na podłączonym urządzeniu zdalnym. Instytut IVI odgrywa rolę przez kontroler AVRCP, wszystkie uruchomione elementy sterujące, które mają wpływ na odtwarzanie dźwięku, zależą od łącza A2DP z urządzeniem docelowym.

Aby można było przeglądać konkretny odtwarzacz na telefonie z Androidem przez AVRCP, aplikacja do multimediów na telefonie musi zapewniać MediaBrowserService i zezwól aplikacji com.android.bluetooth na dostęp do tej usługi. Szczegółowa instrukcja tworzenia usługi przeglądarki multimediów