Bluetooth

Android menyediakan implementasi Bluetooth penuh dengan dukungan untuk banyak profil Bluetooth umum di dalam mobil. Ada juga banyak peningkatan yang meningkatkan kinerja dan pengalaman dengan perangkat dan layanan lain.

Manajemen koneksi Bluetooth

Di Android, CarBluetoothService memelihara perangkat Bluetooth pengguna saat ini dan daftar prioritas untuk setiap koneksi profil ke IVI. Perangkat terhubung ke profil dalam urutan prioritas yang ditentukan. Kapan mengaktifkan, menonaktifkan, dan menyambungkan perangkat ke profil ditentukan oleh kebijakan koneksi default yang dapat diganti dengan penggunaan hamparan sumber daya , jika diinginkan.

Konfigurasikan manajemen koneksi otomotif

Nonaktifkan kebijakan telepon default

Tumpukan Bluetooth Android mempertahankan kebijakan koneksi untuk ponsel yang diaktifkan secara default. Kebijakan ini harus dinonaktifkan pada perangkat Anda agar tidak bertentangan dengan kebijakan otomotif yang dimaksud di CarBluetoothService . Meskipun hamparan produk Mobil akan menangani hal ini untuk Anda, Anda dapat menonaktifkan kebijakan telepon di hamparan sumber daya dengan menyetel enable_phone_policy ke false di MAXIMUM_CONNECTED_DEVICES di /packages/apps/Bluetooth/res/values/config.xml .

Gunakan kebijakan otomotif default

CarBluetoothService mempertahankan izin profil default. Daftar perangkat yang dikenal dan prioritas koneksi ulang profilnya ada di service/src/com/android/car/BluetoothProfileDeviceManager.java .

Selain itu, kebijakan manajemen koneksi Bluetooth dapat ditemukan di service/src/com/android/car/BluetoothDeviceConnectionPolicy.java . Secara default, kebijakan ini menentukan kapan Bluetooth harus tersambung dan terputus dari perangkat yang terikat. Ia juga mengelola kasus khusus mobil kapan adaptor harus dihidupkan dan dimatikan.

Buat kebijakan manajemen koneksi otomotif khusus Anda sendiri

Jika kebijakan otomotif default tidak memenuhi kebutuhan Anda, kebijakan ini juga dapat dinonaktifkan demi kebijakan khusus Anda sendiri. Kebijakan khusus Anda, minimal, bertanggung jawab untuk menentukan kapan harus mengaktifkan dan menonaktifkan adaptor Bluetooth, serta kapan harus menyambungkan perangkat. Berbagai peristiwa dapat digunakan untuk mengaktifkan/menonaktifkan adaptor Bluetooth dan memulai koneksi perangkat, termasuk peristiwa yang disebabkan oleh perubahan pada properti mobil tertentu.

Nonaktifkan kebijakan otomotif default

Pertama, untuk menggunakan kebijakan khusus, kebijakan otomotif default harus dinonaktifkan dengan menyetel useDefaultBluetoothConnectionPolicy ke false di hamparan sumber daya . Sumber daya ini awalnya didefinisikan sebagai bagian dari MAXIMUM_CONNECTED_DEVICES dalam packages/services/Car/service/res/values/config.xml .

Mengaktifkan dan menonaktifkan adaptor Bluetooth

Salah satu fungsi inti kebijakan Anda adalah menghidupkan dan mematikan adaptor Bluetooth pada waktu yang tepat. Anda dapat menggunakan API kerangka BluetoothAdapter.enable() dan BluetoothAdapter.disable() untuk mengaktifkan dan menonaktifkan adaptor. Panggilan ini harus mengikuti status tetap yang dipilih pengguna melalui Pengaturan atau cara lainnya. Salah satu cara untuk melakukannya adalah sebagai berikut:

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

Tentukan kapan harus menghidupkan dan mematikan adaptor Bluetooth

Dengan kebijakan khusus, Anda bebas menentukan peristiwa mana yang menunjukkan waktu terbaik untuk mengaktifkan dan menonaktifkan adaptor. Salah satu cara untuk melakukan hal ini adalah dengan menggunakan status daya MAXIMUM_CONNECTED_DEVICES di 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;
        }
    }
};

Tentukan kapan harus menghubungkan perangkat

Demikian pula, ketika Anda menentukan peristiwa yang harus memicu dimulainya koneksi perangkat, CarBluetoothManager menyediakan panggilan API connectDevices() yang melanjutkan untuk menghubungkan perangkat berdasarkan daftar prioritas yang ditentukan untuk setiap profil Bluetooth.

Salah satu contoh kapan Anda mungkin ingin melakukan ini adalah setiap kali adaptor Bluetooth menyala:

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

Verifikasi manajemen koneksi otomotif

Cara termudah untuk memverifikasi perilaku kebijakan koneksi Anda adalah dengan mengaktifkan Bluetooth di IVI Anda dan memvalidasi bahwa perangkat tersebut secara otomatis terhubung ke perangkat yang benar dalam urutan yang sesuai. Anda dapat mengaktifkan adaptor Bluetooth melalui UI pengaturan, atau dengan perintah adb berikut:

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

Selain itu, output dari perintah berikut dapat digunakan untuk melihat informasi debug terkait koneksi Bluetooth:

adb shell dumpsys car_service

Terakhir, jika Anda telah membuat kebijakan otomotif sendiri, memverifikasi perilaku koneksi khusus memerlukan pengendalian peristiwa yang Anda pilih untuk memicu koneksi perangkat.

Profil Bluetooth otomotif

Di Android, IVI dapat mendukung beberapa perangkat yang terhubung secara bersamaan melalui Bluetooth. Layanan telepon Bluetooth multi-perangkat memungkinkan pengguna menghubungkan perangkat terpisah secara bersamaan, seperti telepon pribadi dan telepon kantor, dan melakukan panggilan bebas genggam dari salah satu perangkat.

Batasan koneksi diberlakukan oleh masing-masing profil Bluetooth, biasanya dalam penerapan layanan profil itu sendiri. Secara default, CarBluetoothService tidak membuat penilaian lebih lanjut mengenai jumlah maksimum perangkat terhubung yang diperbolehkan.

Profil Bebas Genggam

Profil Bebas Genggam Bluetooth (HFP) memungkinkan kendaraan membuat dan menerima panggilan telepon melalui perangkat jarak jauh yang terhubung. Setiap koneksi perangkat mendaftarkan akun telepon terpisah dengan TelecomManager , yang mengiklankan akun telepon apa pun yang tersedia ke aplikasi IVI.

IVI dapat terhubung ke beberapa perangkat melalui HFP. MAX_STATE_MACHINES_POSSIBLE MAXIMUM_CONNECTED_DEVICES di HeadsetClientService menentukan jumlah maksimum koneksi HFP simultan.

Saat pengguna membuat atau menerima panggilan telepon dari perangkat, akun telepon terkait akan membuat objek HfpClientConnection . Aplikasi Dialer berinteraksi dengan objek HfpClientConnection untuk mengelola fitur panggilan, seperti menerima panggilan atau menutup telepon.

Perlu dicatat bahwa aplikasi Dialer default tidak mendukung beberapa perangkat HFP yang terhubung secara bersamaan. Untuk menerapkan HFP multi-perangkat, penyesuaian diperlukan agar pengguna dapat memilih akun perangkat mana yang akan digunakan saat melakukan panggilan. Aplikasi kemudian memanggil telecomManager.placeCall dengan akun yang benar. Anda perlu memverifikasi bahwa fungsi multi-perangkat lainnya juga berfungsi sebagaimana mestinya.

Verifikasi HFP multi-perangkat

Untuk memeriksa apakah konektivitas multi-perangkat berfungsi dengan baik melalui Bluetooth:

  1. Menggunakan Bluetooth, sambungkan perangkat ke IVI dan streaming audio dari perangkat.
  2. Hubungkan dua ponsel ke IVI melalui Bluetooth.
  3. Pilih satu telepon. Lakukan panggilan keluar langsung dari telepon, dan lakukan panggilan keluar menggunakan IVI.
    1. Kedua kali, verifikasi audio streaming dijeda dan audio ponsel diputar melalui speaker IVI yang terhubung.
  4. Menggunakan telepon yang sama, menerima panggilan masuk langsung di telepon, dan menerima panggilan masuk menggunakan IVI.
    1. Kedua kali, verifikasi audio streaming dijeda dan audio ponsel diputar melalui speaker IVI yang terhubung.
  5. Ulangi langkah 3 dan 4 dengan telepon lain yang terhubung.

Panggilan darurat

Kemampuan melakukan panggilan darurat merupakan aspek penting dari fungsi telepon dan Bluetooth di dalam mobil. Ada beberapa cara panggilan darurat dapat dimulai dari IVI, termasuk:

  • Solusi eCall mandiri
  • Solusi eCall terintegrasi ke dalam IVI
  • Mengandalkan ponsel Bluetooth yang terhubung ketika tidak ada sistem internal yang tersedia

Hubungkan panggilan darurat

Meskipun peralatan eCall sangat penting bagi keselamatan, saat ini peralatan tersebut tidak terintegrasi ke dalam Android. ConnectionService dapat digunakan untuk mengekspos fitur panggilan darurat melalui Android, yang juga memiliki keuntungan dalam memperkenalkan opsi aksesibilitas untuk panggilan darurat. Untuk mempelajari lebih lanjut, lihat Membuat aplikasi panggilan .

Berikut adalah contoh cara membuat ConnectionService darurat :

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

Aktifkan Bluetooth untuk panggilan darurat

Menelepon darurat sebelum Android 10 melibatkan panggilan langsung dari ponsel dan memanggil peralatan khusus jika tersedia (misalnya, pemicu otomatis saat mendeteksi bahaya atau tindakan pengguna). Di Android 10 dan lebih tinggi, Dialer di mobil bisa langsung memanggil nomor darurat, asalkan MAXIMUM_CONNECTED_DEVICES ini di 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>

Dengan menerapkan panggilan darurat dengan cara ini, aplikasi lain, seperti pengenalan suara, juga dapat menghubungi nomor darurat.

Profil Akses Buku Telepon

Profil Akses Buku Telepon Bluetooth (PBAP) mengunduh kontak dan riwayat panggilan dari perangkat jarak jauh yang terhubung. PBAP menyimpan daftar kontak teragregasi dan dapat dicari yang diperbarui oleh mesin status klien PBAP. Setiap perangkat yang terhubung berinteraksi dengan mesin status klien PBAP terpisah, sehingga kontak dikaitkan dengan perangkat yang tepat saat melakukan panggilan.

PBAP bersifat searah dan oleh karena itu memerlukan IVI untuk membuat instance koneksi ke MAXIMUM_CONNECTED_DEVICES apa pun di PbapClientService yang menentukan jumlah maksimum koneksi perangkat PBAP simultan yang diperbolehkan dengan IVI. Klien PBAP menyimpan kontak untuk setiap perangkat yang terhubung di Penyedia Kontak yang kemudian dapat diakses oleh aplikasi untuk mendapatkan buku telepon untuk setiap perangkat.

Selain itu, sambungan profil harus disahkan oleh IVI dan perangkat seluler agar sambungan dapat dibuat. Ketika klien PBAP terputus, database internal menghapus semua kontak dan riwayat panggilan yang terkait dengan perangkat yang terhubung sebelumnya.

Profil Akses Pesan

Profil Akses Pesan Bluetooth (MAP) memungkinkan kendaraan mengirim dan menerima pesan SMS melalui perangkat jarak jauh yang terhubung. Saat ini, pesan tidak disimpan secara lokal di IVI. Sebaliknya, setiap kali perangkat jarak jauh yang terhubung menerima pesan, IVI menerima dan menguraikan pesan tersebut dan menyiarkan kontennya dalam instance Intent , yang kemudian dapat diterima oleh aplikasi.

Untuk terhubung ke perangkat seluler untuk tujuan mengirim dan menerima pesan, IVI harus memulai koneksi MAP. MAXIMUM_CONNECTED_DEVICES di MapClientService menentukan jumlah maksimum koneksi perangkat MAP simultan yang diperbolehkan dengan IVI. Setiap koneksi harus disahkan oleh IVI dan perangkat seluler sebelum pesan dapat ditransfer.

Profil Distribusi Audio Tingkat Lanjut

Profil Distribusi Audio Tingkat Lanjut Bluetooth (A2DP) memungkinkan kendaraan menerima aliran audio dari perangkat jarak jauh yang terhubung.

Tidak seperti profil lainnya, jumlah maksimum perangkat A2DP yang terhubung diterapkan di tumpukan asli dan bukan di Java. Nilainya saat ini di-hardcode menjadi 1 menggunakan variabel kDefaultMaxConnectedAudioDevices dalam packages/modules/Bluetooth/system/btif/src/btif_av.cc .

Profil Kendali Jarak Jauh Audio/Video

Profil Remote Control Audio/Video Bluetooth (AVRCP) memungkinkan kendaraan mengontrol dan menelusuri pemutar media pada perangkat jarak jauh yang terhubung. Karena IVI berperan sebagai pengontrol AVRCP, setiap kontrol yang dipicu yang memengaruhi pemutaran audio bergantung pada koneksi A2DP ke perangkat target.

Agar pemutar media tertentu di ponsel Android dapat dijelajahi oleh IVI melalui AVRCP, aplikasi media di ponsel harus menyediakan MediaBrowserService dan mengizinkan akses com.android.bluetooth ke layanan tersebut. Membangun layanan browser media menjelaskan cara melakukan ini secara detail.