Bluetooth

Android, birçok yaygın araç içi Bluetooth profilini destekleyen tam Bluetooth uygulaması sunar. Ayrıca, diğer cihazlar ve hizmetlerdeki performansı ve deneyimi iyileştiren birçok geliştirme de bulunmaktadır.

Bluetooth bağlantı yönetimi

Android'de CarBluetoothService, mevcut kullanıcının Bluetooth cihazlarını ve IVI'ye her profil bağlantısı için öncelik listelerini tutar. Cihazlar, tanımlanmış bir öncelik sırasına göre profillere bağlanır. Cihazların bir profile ne zaman bağlanacağı, profilden ne zaman ayrılacağı ve ne zaman etkinleştirileceği/devre dışı bırakılacağı, kaynak yerleşimi 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ı sürdürür. Bu politika, CarBluetoothService'teki amaçlanan otomotiv politikasıyla çakışmaması için cihazınızda devre dışı bırakılmalıdır. Araba ürünü yer paylaşımı bu durumu sizin için ele alsa da kaynak yer paylaşımında telefon politikasını devre dışı bırakabilirsiniz. Bunun için /packages/apps/Bluetooth/res/values/config.xml içindeki MAXIMUM_CONNECTED_DEVICES bölümünde enable_phone_policy değerini false olarak ayarlayın.

Varsayılan otomotiv politikasını kullanma

CarBluetoothService, varsayılan profil izinlerini korur. Bilinen cihazların listesi ve bunların profil yeniden bağlantı öncelikleri service/src/com/android/car/BluetoothProfileDeviceManager.java içinde yer alır.

Bluetooth bağlantı yönetimi politikasına service/src/com/android/car/BluetoothDeviceConnectionPolicy.java bölümünden de ulaşabilirsiniz. Bu politika, varsayılan olarak Bluetooth'un bağlı cihazlara bağlanması ve bu cihazlardan bağlantısının kesilmesi gereken durumları tanımlar. Ayrıca adaptörün ne zaman açılıp kapatılması gerektiğiyle ilgili araca özel durumları da yönetir.

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

Varsayılan otomotiv politikası ihtiyaçlarınız için yeterli değilse kendi özel politikanız lehine devre dışı da bırakılabilir. Özel politikanız, en azından 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 bağdaştırıcısını etkinleştirmek/devre dışı bırakmak ve cihaz bağlantılarını başlatmak için çeşitli etkinlikler kullanılabilir. Bu etkinlikler arasında belirli araba özelliklerindeki değişikliklerden kaynaklanan etkinlikler de yer alır.

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

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

Bluetooth bağdaştırıcısı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'dan veya başka bir yöntemle seçtiği kalıcı duruma saygı duymalıdır. Bunu yapmanın bir yolu şöyledir:

/**
 * 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ü ne zaman açıp kapatacağınızı belirleme

Özel politikanızla, adaptörün etkinleştirilmesi ve devre dışı bırakılması için en uygun zamanları hangi etkinliklerin gösterdiğini belirleyebilirsiniz. Bunu yapmanın bir yolu, MAXIMUM_CONNECTED_DEVICES güç durumlarını kullanmaktır 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;
        }
    }
};

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

Benzer şekilde, cihaz bağlantılarını başlatacak 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.

Bunu yapmak isteyebileceğiniz durumlardan biri, Bluetooth adaptörü her açıldığında olabilir:

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ştirmek ve doğru cihazlara uygun sırayla otomatik olarak bağlandığını doğrulamaktır. Bluetooth adaptörünü ayarlar kullanıcı arayüzünden veya aşağıdaki adb komutlarıyla açıp kapatabilirsiniz:

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 çıktısı 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 her iki cihazdan da eller serbest aramalar yapmasına olanak tanır.

Bağlantı sınırları, genellikle profil hizmetinin kendi uygulaması içinde her bir Bluetooth profili tarafından uygulanır. Varsayılan olarak, CarBluetoothService, izin verilen maksimum bağlı cihaz sayısı hakkında başka bir değerlendirme yapmaz.

Hands-Free Profile

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

IVI, HFP aracılığıyla birden fazla cihaza bağlanabilir. MAX_STATE_MACHINES_POSSIBLE MAXIMUM_CONNECTED_DEVICES in HeadsetClientService, eşzamanlı HFP bağlantılarının maksimum sayısını tanımlar.

Bir kullanıcı bir cihazdan telefon ettiğinde veya cihazına telefon geldiğinde ilgili telefon hesabı bir HfpClientConnection nesnesi oluşturur. Telefon uygulaması, arama özelliklerini (ör. aramayı kabul etme veya kapatma) yönetmek için HfpClientConnection nesnesiyle etkileşime girer.

Varsayılan çevirici uygulamasının, aynı anda bağlı birden fazla HFP cihazını 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 verecek şekilde özelleştirme yapılması gerekir. Daha sonra uygulama, telecomManager.placeCall ile doğru hesapla iletişime geçer. Diğer çok cihazlı işlevlerin de amaçlandığı gibi çalıştığını doğrulamanız gerekir.

Çok cihazlı HFP'yi doğrulama

Çoklu cihaz bağlantısının Bluetooth üzerinden düzgün çalıştığını kontrol etmek için:

  1. Bluetooth'u kullanarak bir cihazı IVI'ye bağlayın ve cihazdan ses akışı yapın.
  2. Bluetooth üzerinden iki telefonu IVI'ye bağlayın.
  3. Bir telefon seçin. Doğrudan telefondan giden arama yapma 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 gelen aramaları doğrudan telefonda ve IVI'yi kullanarak 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ı diğer bağlı telefonla tekrarlayın.

Acil durum araması

Acil durum araması yapabilme özelliği, arabadaki telefon ve Bluetooth işlevlerinin önemli bir yönüdür. IVI'den acil durum araması başlatmanın çeşitli yolları vardır. Örneğin:

  • 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ı yapma

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

Aşağıda, acil durum ConnectionService'in nasıl oluşturulacağına dair bir örnek 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 numara çevirmek ve varsa özel ekipmanları (ör. tehlike algılandığında veya kullanıcı işlemi yapıldığında otomatik tetikleme) kullanmak gerekiyordu. Android 10 ve sonraki sürümlerde, arabadaki Çevirici, apps/Bluetooth/res/values/config.xml içinde MAXIMUM_CONNECTED_DEVICES şu koşullar karşılandığında doğrudan bir acil durum numarasını arayabilir:

<!-- 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 numarasını arayabilir.

Telefon Defteri Erişim Profili

Bluetooth Telefon Rehberi Erişim Profili (PBAP), bağlı bir uzak cihazdan kişileri ve arama geçmişlerini indirir. PBAP, PBAP istemci durum makinesi tarafından güncellenen, birleştirilmiş ve aranabilir bir kişi listesi tutar. Bağlı her cihaz, ayrı bir PBAP istemci durum makinesiyle etkileşime girer. Bu sayede, arama yaparken kişiler doğru cihazla ilişkilendirilir.

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, her bağlı cihazın kişilerini Kişiler Sağlayıcı'da depolar. Bu kişilere daha sonra bir uygulama tarafından erişilerek her cihazın telefon rehberi oluşturulabilir.

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 istemcisi bağlantıyı kestiğinde, dahili veritabanı, daha önce bağlı olan cihazla ilişkili tüm kişileri ve görüşme 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öndermesine ve almasına olanak tanır. Şu anda mesajlar IVI'da yerel olarak depolanmıyor. Bunun yerine, bağlı uzak cihaz bir mesaj aldığında IVI, mesajı alıp ayrıştırır ve içeriğini bir Intent örneğinde yayınlar. Bu örnek daha sonra bir uygulama tarafından alınabilir.

IVI'nin, mesaj gönderme ve alma amacıyla mobil cihaza bağlanmak için MAP bağlantısını başlatması gerekir. MAXIMUM_CONNECTED_DEVICES in MapClientService, IVI ile izin verilen maksimum eşzamanlı MAP cihazı bağlantı 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 uzak 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ığında zorunlu kılınır. Değer şu anda 1 olarak sabit kodlanmıştır. Bu işlem için packages/modules/Bluetooth/system/btif/src/btif_av.cc içinde kDefaultMaxConnectedAudioDevices değişkeni kullanılır.

Uzaktan Ses ve Video Kontrolü Profili

Bluetooth Ses/Video Uzaktan Kumanda Profili (AVRCP), aracın bağlı bir uzaktan cihazdaki medya oynatıcıları kontrol etmesine ve bunlara göz atmasına olanak tanır. IVI, AVRCP denetleyicisi rolünü oynadığından, ses çalmayı etkileyen tüm tetiklenen kontroller hedef cihaza A2DP bağlantısı üzerinden yapılır.

Android telefondaki belirli bir medya oynatıcının AVRCP aracılığıyla IVI tarafından göz atılabilir olması için telefondaki medya uygulamasının MediaBrowserService sağlaması ve bu hizmete com.android.bluetooth erişimine 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.