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 performansı ve deneyimi geliştiren birçok geliştirme de bulunmaktadır.

Bluetooth bağlantı yönetimi

Android içinde CarBluetoothService , mevcut kullanıcının Bluetooth cihazlarını ve IVI'ya yapılan her profil bağlantısı için öncelik listelerini korur. Cihazlar profillere tanımlanmış bir öncelik sırasına göre bağlanır. Cihazların ne zaman etkinleştirileceği, devre dışı bırakılacağı ve bir profile bağlanacağı, istenirse bir kaynak katmanı kullanılarak geçersiz kılınabilecek 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ırakın

Android Bluetooth yığını, telefonlar için varsayılan olarak etkin olan bir bağlantı politikasını korur. CarBluetoothService'te amaçlanan otomotiv politikasıyla çelişmemesi için bu politikanın cihazınızda devre dışı bırakılması gerekir. Araç ürün katmanının bu sorunu sizin için halletmesi gerekirken, /packages/apps/Bluetooth/res/values/config.xml dosyasındaki MAXIMUM_CONNECTED_DEVICES öğesinde enable_phone_policy değerini false olarak ayarlayarak bir kaynak katmanında telefon politikasını devre dışı bırakabilirsiniz.

Varsayılan otomotiv politikasını kullan

CarBluetoothService varsayılan profil izinlerini korur. Bilinen cihazların listesi ve bunların profil yeniden bağlanma öncelikleri service/src/com/android/car/BluetoothProfileDeviceManager.java dosyasındadır.

Ayrıca Bluetooth bağlantı yönetimi ilkesi service/src/com/android/car/BluetoothDeviceConnectionPolicy.java dosyasında bulunabilir. Varsayılan olarak bu politika, Bluetooth'un bağlı cihazlara ne zaman bağlanması ve bağlantının kesilmesi gerektiği örneklerini tanımlar. Ayrıca adaptörün ne zaman açılıp kapatılması gerektiğine ilişkin araca özel durumları da yönetir.

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

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 bağdaştırıcısının ne zaman etkinleştirilip devre dışı bırakılacağının yanı sıra cihazların ne zaman bağlanacağını belirlemekten sorumludur. Bluetooth adaptörünü etkinleştirmek/devre dışı bırakmak ve belirli araç özelliklerindeki değişikliklerden kaynaklanan olaylar da dahil olmak üzere cihaz bağlantılarını başlatmak için çeşitli olayları kullanmak mümkündür.

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

İlk olarak, özel bir politika kullanmak için, bir kaynak yer paylaşımında useDefaultBluetoothConnectionPolicy false olarak ayarlanarak varsayılan otomotiv politikasının devre dışı bırakılması gerekir. Bu kaynak orijinal olarak packages/services/Car/service/res/values/config.xml dosyasındaki MAXIMUM_CONNECTED_DEVICES öğesinin parçası olarak tanımlandı.

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. Bağdaştırıcıyı 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 yollarla seçtiği kalıcı duruma uygun olmalıdır. 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ü ne zaman açıp kapatacağınızı belirleyin

Özel politikanızla, bağdaştırıcıyı etkinleştirmek ve devre dışı bırakmak için hangi olayların en iyi zamanları gösterdiğini belirlemekte özgürsünüz. Bunu yapmanın bir yolu da CarPowerManager 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ı belirleyin

Benzer şekilde, cihaz bağlantılarının başlatılmasını tetiklemesi gereken olayları 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 ne zaman yapmak isteyebileceğinize bir örnek, Bluetooth adaptörünün açıldığı zamandır:

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'nızda Bluetooth'u etkinleştirmek ve doğru cihazlara uygun sırayla otomatik olarak bağlandığını doğrulamaktır. Bluetooth adaptörünü ayarlar arayüzünden veya aşağıdaki adb komutlarıyla değiştirebilirsiniz:

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 herhangi bir özel bağlantı davranışını doğrulamak, cihaz bağlantılarını tetiklemek için seçtiğiniz olayların kontrol edilmesini gerektirir.

Otomotiv Bluetooth profilleri

Android'de IVI, Bluetooth üzerinden aynı anda bağlanan 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 arama yapmasına olanak tanır.

Bağlantı sınırları, genellikle profil hizmetinin uygulanması kapsamında, 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ğerlendirmede bulunmaz.

Eller Serbest Profili

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

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

Kullanıcı bir cihazdan telefon araması yaptığında veya aldığında, ilgili telefon hesabı bir HfpClientConnection nesnesi oluşturur. Dialer uygulaması, bir aramayı kabul etme veya telefonu kapatma gibi arama özelliklerini yönetmek için HfpClientConnection nesnesiyle etkileşime girer.

Varsayılan Dialer uygulamasının aynı anda bağlı birden fazla HFP cihazını desteklemediğine dikkat edilmelidir. Çok cihazlı HFP'yi uygulamak için, kullanıcıların arama yaparken hangi cihaz hesabını kullanacaklarını seçmelerine olanak tanıyan özelleştirme gereklidir. Uygulama daha sonra telecomManager.placeCall doğru hesapla çağırır. Diğer çoklu cihaz işlevlerinin de amaçlandığı gibi çalıştığını doğrulamanız gerekir.

Çoklu cihaz HFP'sini doğrulayın

Ç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'ya bağlayın ve cihazdan ses akışı yapın.
  2. İki telefonu Bluetooth üzerinden IVI'ya bağlayın.
  3. Bir telefon seç. Doğrudan telefondan giden bir arama yapın ve IVI'yı kullanarak bir giden arama yapın.
    1. Her iki seferde de, aktarılan sesin duraklatıldığını ve telefon sesinin IVI bağlı hoparlörler üzerinden çalındığını doğrulayın.
  4. Aynı telefonu kullanarak, gelen bir çağrıyı doğrudan telefondan alın ve IVI'yı kullanarak gelen bir çağrıyı alın.
    1. Her iki seferde de, akışlı sesin duraklatıldığını ve telefon sesinin IVI bağlı hoparlörler üzerinden çalındığını doğrulayın.
  5. Bağlı diğer telefonla 3. ve 4. adımları tekrarlayın.

Acil arama

Acil durum aramaları yapabilme yeteneği, araçtaki telefon ve Bluetooth işlevlerinin önemli bir yönüdür. IVI'dan acil durum çağrısı başlatmanın çeşitli yolları vardır; bunlar arasında şunlar yer alır:

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

Acil durum çağrısı bağlama

eCall ekipmanı güvenlik açısından kritik öneme sahip olsa da şu anda Android'e entegre değildir. Acil durum çağrıları için erişilebilirlik seçenekleri sunma avantajına da sahip olan Android aracılığıyla acil durum çağrı özelliklerini ortaya çıkarmak için ConnectionService'i kullanmak mümkündür. Daha fazla bilgi edinmek için bkz . Arama uygulaması oluşturma .

Acil bir ConnectionService'in nasıl kurulacağına ilişkin bir örnek:

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 aramalar için Bluetooth'u etkinleştirin

Android 10'dan önce acil durum çağrısı, bir telefondan doğrudan aramayı ve varsa özel ekipmanı (örneğin, tehlike algılandığında veya bir kullanıcı eylemi algılandığında otomatik tetikleme) çağırmayı içeriyordu. Android 10 ve üzeri sürümlerde, apps/Bluetooth/res/values/config.xml dosyasında MAXIMUM_CONNECTED_DEVICES olması koşuluyla, arabadaki Çevirici 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ını bu şekilde uygulayarak, ses tanıma gibi diğer uygulamalar da acil durum numarasını arayabilir.

Telefon Rehberi Erişim Profili

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

PBAP tek yönlüdür ve bu nedenle IVI'nın PbapClientService herhangi bir MAXIMUM_CONNECTED_DEVICES bağlantısına örnek oluşturmasını gerektirir, IVI ile izin verilen eşzamanlı PBAP cihazı bağlantılarının maksimum sayısını tanımlar. PBAP istemcisi, bağlı her cihazın kişilerini Kişi Sağlayıcısında saklar ve daha sonra her cihaz için telefon rehberi oluşturmak üzere bir uygulama tarafından bunlara erişilebilir.

Ayrıca bağlantının yapılabilmesi için profil bağlantısının hem IVI hem de mobil cihaz tarafından yetkilendirilmesi gerekmektedir. Bir PBAP istemcisinin bağlantısı kesildiğinde, dahili veri tabanı daha önce bağlanan 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 aracılığıyla SMS mesajları gönderip almasına olanak tanır. Şu anda mesajlar IVI'da yerel olarak saklanmamaktadır. 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 daha sonra bir uygulama tarafından alınabilir.

Mesaj göndermek ve almak amacıyla bir mobil cihaza bağlanmak için IVI'nın MAP bağlantısını başlatması gerekir. MapClientService 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 uzak cihazdan ses akışları almasına olanak tanır.

Diğer profillerden farklı olarak, bağlı A2DP cihazlarının maksimum sayısı Java'da değil yerel yığında uygulanır. Değer şu anda packages/modules/Bluetooth/system/btif/src/btif_av.cc dosyasındaki kDefaultMaxConnectedAudioDevices değişkeni kullanılarak 1 olarak kodlanmıştır.

Ses/Video Uzaktan Kumanda Profili

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

Bir Android telefondaki belirli bir medya oynatıcısının AVRCP yoluyla IVI tarafından göz atılabilmesi için, telefondaki medya uygulamasının bir MediaBrowserService sağlaması ve com.android.bluetooth bu hizmete erişimine izin vermesi gerekir. Medya tarayıcı hizmeti oluşturmak bunun nasıl yapılacağını ayrıntılı olarak açıklamaktadır.