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:
- Bluetooth'u kullanarak bir cihazı IVI'ya bağlayın ve cihazdan ses akışı yapın.
- İki telefonu Bluetooth üzerinden IVI'ya bağlayın.
- Bir telefon seç. Doğrudan telefondan giden bir arama yapın ve IVI'yı kullanarak bir giden arama yapın.
- 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.
- Aynı telefonu kullanarak, gelen bir çağrıyı doğrudan telefondan alın ve IVI'yı kullanarak gelen bir çağrıyı alın.
- 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.
- 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.