Bluetooth

Android, birçok yaygın araç içi Bluetooth profilini destekleyen tam bir Bluetooth uygulaması sağlar. Ayrıca, diğer cihaz ve hizmetlerle ilgili performansı ve deneyimi iyileştiren birçok geliştirme de vardır.

Bluetooth bağlantısı yönetimi

Android'de CarBluetoothService, mevcut kullanıcının Bluetooth cihazlarını ve IVI'ye bağlı her profil bağlantısı için öncelik listelerini korur. Cihazlar, tanımlanmış öncelik sırasına göre profillere bağlanır. Cihazların ne zaman etkinleştirileceği, devre dışı bırakılacağı ve bir profile bağlanacağı, isterseniz kaynak yer paylaşımı kullanılarak geçersiz kılınabilen varsayılan bir bağlantı politikası tarafından belirlenir.

Otomotiv bağlantı yönetimini yapılandırma

Varsayılan telefon politikasını devre dışı bırakma

Android Bluetooth yığını, telefonlar için varsayılan olarak etkinleştirilen bir bağlantı politikası uygular. Bu politika, CarBluetoothService'teki amaçlanan otomotiv politikasıyla çakışmadığından cihazınızda devre dışı bırakılmalıdır. Araba ürün yer paylaşımı bu işlemi sizin için yapmalıdır ancak /packages/apps/Bluetooth/res/values/config.xml'teki MAXIMUM_CONNECTED_DEVICES bölümünde enable_phone_policy'yi false olarak ayarlayarak telefon politikasını kaynak yer paylaşımında devre dışı bırakabilirsiniz.

Varsayılan otomotiv politikasını kullanma

CarBluetoothService, varsayılan profil izinlerini korur. Bilinen cihazların listesi ve profil yeniden bağlantı öncelikleri service/src/com/android/car/BluetoothProfileDeviceManager.java'tedir.

Bluetooth bağlantısı yönetimi politikasını service/src/com/android/car/BluetoothDeviceConnectionPolicy.java adresinde de bulabilirsiniz. Varsayılan olarak bu politika, Bluetooth'un bağlı cihazlara bağlanıp bu cihazlarla bağlantısını kesmesi gereken durumları tanımlar. Ayrıca, adaptörün ne zaman açılması ve kapatılması gerektiğine dair araca özgü durumları da yönetir.

Kendi özel otomotiv bağlantısı yönetim politikanızı oluşturma

Varsayılan otomotiv politikası ihtiyaçlarınız için yeterli değilse kendi özel politikanız için devre dışı bırakılabilir. Özel politikanız, Bluetooth adaptörünün ne zaman etkinleştirileceğini ve devre dışı bırakılacağını, ayrıca cihazların ne zaman bağlanacağını belirlemekten sorumludur. Bluetooth adaptörünü etkinleştirmek/devre dışı bırakmak ve belirli araba özelliklerindeki değişikliklerden kaynaklanan etkinlikler de dahil olmak üzere cihaz bağlantılarını başlatmak için çeşitli etkinlikler kullanılabilir.

Varsayılan otomotiv politikasını devre dışı bırakma

Özel bir politikayı kullanmak için öncelikle kaynak yer paylaşımında useDefaultBluetoothConnectionPolicy değerini false olarak ayarlayarak varsayılan otomotiv politikası devre dışı bırakılmalıdır. Bu kaynak, başlangıçta packages/services/Car/service/res/values/config.xml'daki MAXIMUM_CONNECTED_DEVICES kapsamında tanımlanır.

Bluetooth adaptörünü etkinleştirme ve devre dışı bırakma

Politikanızın temel işlevlerinden biri, Bluetooth adaptörünü uygun zamanlarda açıp kapatmaktır. Adaptörü etkinleştirmek ve devre dışı bırakmak için BluetoothAdapter.enable() ve BluetoothAdapter.disable() çerçeve API'lerini kullanabilirsiniz. Bu çağrılar, kullanıcının Ayarlar veya başka bir yöntemle seçtiği kalıcı duruma saygı göstermelidir. Bunu yapmanın bir yolu aşağıdaki gibidir:

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

Bluetooth adaptörünün ne zaman açılacağını ve kapatılacağını belirleme

Özel politikanızla, bağdaştırıcının etkinleştirilmesi ve devre dışı bırakılması için en uygun zamanları gösteren etkinlikleri belirleyebilirsiniz. Bunu yapmanın bir yolu, CarPowerManager'daki MAXIMUM_CONNECTED_DEVICES güç durumlarını kullanmaktır:

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

Cihazların ne zaman bağlanacağını belirleme

Benzer şekilde, cihaz bağlantılarının başlamasını tetiklemesi gereken etkinlikleri belirlediğinizde CarBluetoothManager, her Bluetooth profili için tanımlanan öncelik listelerine göre cihazları bağlamaya devam eden connectDevices() API çağrısını sağlar.

Bluetooth adaptörü açıldığında bunu yapmak isteyebilirsiniz.

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

Otomotiv bağlantı yönetimini doğrulama

Bağlantı politikanızın davranışını doğrulamanın en kolay yolu, IVI'nizde Bluetooth'u etkinleştirip doğru sırayla doğru cihazlara otomatik olarak bağlandığını doğrulamaktır. Bluetooth adaptörünü ayarlar kullanıcı arayüzü üzerinden veya aşağıdaki adb komutlarıyla etkinleştirebilir ya da devre dışı bırakabilirsiniz:

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

Ayrıca, Bluetooth bağlantılarıyla ilgili hata ayıklama bilgilerini görmek için aşağıdaki komutun çıkışı kullanılabilir:

adb shell dumpsys car_service

Son olarak, kendi otomotiv politikanızı oluşturduysanız özel bağlantı davranışlarını doğrulamak için cihaz bağlantılarını tetiklemek üzere seçtiğiniz etkinlikleri kontrol etmeniz gerekir.

Otomotiv Bluetooth profilleri

Android'de IVI, Bluetooth üzerinden aynı anda bağlı birden fazla cihazı destekleyebilir. Çok cihazlı Bluetooth telefon hizmetleri, kullanıcıların kişisel telefon ve iş telefonu gibi ayrı cihazları aynı anda bağlamasına ve bu cihazlardan eller serbest arama yapmasına olanak tanır.

Bağlantı sınırlamaları, genellikle profil hizmetinin uygulanması kapsamında her Bluetooth profili tarafından zorunlu kılınır. Varsayılan olarak CarBluetoothService, izin verilen maksimum bağlı cihaz sayısı hakkında başka bir karar vermez.

Eller Serbest Profil

Bluetooth Eller Serbest Profili (HFP), aracın bağlı bir uzak cihaz üzerinden telefon araması yapmasına ve aramaları almasına olanak tanır. Her cihaz bağlantısı, TelecomManager'a ayrı bir telefon hesabı kaydeder. Bu hesap, mevcut telefon hesaplarının reklamını IVI uygulamalarına yapar.

IVI, HFP üzerinden birden fazla cihaza bağlanabilir. MAX_STATE_MACHINES_POSSIBLE HeadsetClientService içindeki MAXIMUM_CONNECTED_DEVICES, eşzamanlı HFP bağlantılarının maksimum sayısını tanımlar.

Bir kullanıcı bir cihazdan telefon ettiğinde veya telefon aldığında, ilgili telefon hesabı bir HfpClientConnection nesnesi oluşturur. Telefon uygulaması, aramayı kabul etme veya kapatma gibi arama özelliklerini yönetmek için HfpClientConnection nesnesi ile etkileşim kurar.

Varsayılan Dialer uygulamasının, aynı anda bağlı birden fazla HFP cihazı desteklemediği unutulmamalıdır. Çok cihazlı HFP'yi uygulamak için kullanıcıların arama yaparken hangi cihaz hesabını kullanacağını seçmesine izin vermek üzere özelleştirme yapılması gerekir. Ardından uygulama, doğru hesapla telecomManager.placeCall'ü çağırır. Diğer çok cihazlı işlevlerin de amaçlandığı gibi çalıştığını doğrulamanız gerekir.

Çok cihazlı HFP'yi doğrulama

Çok cihazlı bağlantının Bluetooth üzerinden düzgün çalışıp çalışmadığını kontrol etmek için:

  1. Bluetooth'u kullanarak bir cihazı IVI'ye bağlayın ve cihazdan ses akışı yapın.
  2. İki telefonu Bluetooth üzerinden IVI'ye bağlayın.
  3. Bir telefon seçin. Doğrudan telefondan ve IVI'yi kullanarak giden arama yapma.
    1. Her iki durumda da, aktarılan sesin duraklatıldığını ve telefon sesinin IVI'ye bağlı hoparlörlerden çalındığını doğrulayın.
  4. Aynı telefonu kullanarak doğrudan telefonda ve IVI'de gelen arama alın.
    1. Her iki durumda da, akış sesinin duraklatıldığını ve telefon sesinin IVI'ye bağlı hoparlörlerden çalındığını doğrulayın.
  5. 3. ve 4. adımları bağlı diğer telefonla tekrarlayın.

Acil durum araması

Acil durum araması yapabilme özelliği, araçtaki telefon ve Bluetooth işlevlerinin önemli bir parçasıdır. Acil durum araması, IVI'den aşağıdaki gibi çeşitli yöntemlerle başlatılabilir:

  • Bağımsız eCall çözümü
  • IVI'ye entegre eCall çözümü
  • Yerleşik sistem olmadığında bağlı bir Bluetooth telefona güvenme

Acil durum araması bağlama

eCall ekipmanı güvenlik açısından kritik olsa da şu anda Android'e entegre edilmemiştir. Android üzerinden acil durum araması özelliklerini göstermek için ConnectionService'i kullanabilirsiniz. Bu, acil durum aramaları için erişilebilirlik seçenekleri sunma avantajına da sahiptir. Daha fazla bilgi edinmek için Arama uygulaması oluşturma başlıklı makaleyi inceleyin.

Acil durum ConnectionService'in nasıl oluşturulacağına dair bir örnek aşağıda verilmiştir:

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

Acil durum aramaları için Bluetooth'u etkinleştirme

Android 10'dan önce acil durum araması yapmak için telefondan doğrudan arama yapmak ve varsa özel ekipmanı çağırmak (ör. tehlike algılanması veya kullanıcı işlemi üzerine otomatik tetikleme) gerekiyordu. Android 10 ve sonraki sürümlerde, araçtaki çevirici doğrudan bir acil durum numarasını arayabilir. Bunun için MAXIMUM_CONNECTED_DEVICES'te 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>

Acil durum araması bu şekilde uygulandığında ses tanıma gibi diğer uygulamalar da acil durum numaralarını arayabilir.

Telefon Defteri Erişim Profili

Bluetooth Telefon Rehberi Erişim Profili (PBAP), bağlı uzak bir cihazdan kişileri ve çağrı geçmişlerini indirir. PBAP, PBAP istemci durum makinesi tarafından güncellenen toplu ve aranabilir bir kişi listesi tutar. Bağlı her cihaz, ayrı bir PBAP istemci durum makinesi ile etkileşime girer. Bu, arama yapılırken kişilerin uygun cihazla ilişkilendirilmesine neden olur.

PBAP tek yönlüdür ve bu nedenle IVI'nin herhangi bir MAXIMUM_CONNECTED_DEVICES ile bağlantı oluşturmasını gerektirir. PbapClientService, IVI ile izin verilen maksimum eşzamanlı PBAP cihaz bağlantısı sayısını tanımlar. PBAP istemcisi, bağlı her cihazın kişilerini Kişi Sağlayıcı'da depolar. Bu sağlayıcıya bir uygulama erişerek her cihazın telefon rehberini oluşturabilir.

Ayrıca, bağlantı kurulabilmesi için profil bağlantısının hem IVI hem de mobil cihaz tarafından yetkilendirilmesi gerekir. Bir PBAP istemcisinin bağlantısı kesildiğinde, dahili veritabanı daha önce bağlı olan cihazla ilişkili tüm kişileri ve arama geçmişini kaldırır.

Mesaj Erişim Profili

Bluetooth Mesaj Erişim Profili (MAP), aracın bağlı bir uzak cihaz üzerinden SMS mesajları gönderip almasına olanak tanır. Mesajlar şu anda IVI'de yerel olarak depolanmamaktadır. Bunun yerine, bağlı uzak cihaz bir mesaj aldığında IVI mesajı alır, ayrıştırır ve içeriğini bir Intent örneğinde yayınlar. Bu örnek daha sonra bir uygulama tarafından alınabilir.

Mesaj göndermek ve almak amacıyla bir mobil cihaza bağlanmak için IVI'nin MAP bağlantısını başlatması gerekir. MapClientService içindeki MAXIMUM_CONNECTED_DEVICES, IVI ile izin verilen maksimum eşzamanlı MAP cihaz bağlantısı sayısını tanımlar. Mesajların aktarılabilmesi için her bağlantının IVI ve mobil cihaz tarafından yetkilendirilmesi gerekir.

Gelişmiş Ses Dağıtım Profili

Bluetooth Gelişmiş Ses Dağıtım Profili (A2DP), aracın bağlı bir uzaktan cihazdan ses akışları almasına olanak tanır.

Diğer profillerin aksine, bağlı A2DP cihazlarının maksimum sayısı Java'da değil, yerel yığınta zorunlu kılınmıştır. Değer şu anda packages/modules/Bluetooth/system/btif/src/btif_av.cc içindeki kDefaultMaxConnectedAudioDevices değişkeni kullanılarak 1 olarak kodlanmıştır.

Ses/Görüntü Uzaktan Kumanda Profili

Bluetooth Ses/Video Uzaktan Kumanda Profili (AVRCP), aracın bağlı bir uzaktan kumanda cihazındaki medya oynatıcıları kontrol etmesine ve bu cihazlara göz atmasına olanak tanır. IVI bir AVRCP denetleyicisi rolü oynadığından, ses oynatmayı etkileyen tüm tetiklenen kontroller hedef cihazla A2DP bağlantısına dayanır.

Android telefondaki belirli bir medya oynatıcının AVRCP üzerinden IVI tarafından taranabilmesi için telefondaki medya uygulamasının bir MediaBrowserService sağlaması ve com.android.bluetooth'in bu hizmete erişmesine izin vermesi gerekir. Medya tarayıcı hizmeti oluşturma başlıklı makalede bu işlemin nasıl yapılacağı ayrıntılı olarak açıklanmaktadır.