Bluetooth

Android menyediakan Bluetooth penuh dengan dukungan untuk banyak profil Bluetooth dalam mobil yang umum. Ada juga berbagai penyempurnaan yang meningkatkan kinerja dan pengalaman dengan perangkat lain dan layanan IT perusahaan mereka.

Pengelolaan koneksi Bluetooth

Di dalam Android, CarBluetoothService mempertahankan prioritas dan perangkat Bluetooth pengguna saat ini daftar untuk setiap koneksi profil ke IVI. Perangkat terhubung ke profil dalam urutan prioritas yang ditetapkan. Kapan harus mengaktifkan, menonaktifkan, dan menghubungkan perangkat ke profil diatur oleh kebijakan koneksi {i>default<i} yang dapat diabaikan dengan menggunakan overlay resource, jika yang diinginkan.

Mengonfigurasi pengelolaan koneksi otomotif

Nonaktifkan kebijakan ponsel default

Tumpukan Bluetooth Android mempertahankan kebijakan koneksi untuk ponsel yang diaktifkan oleh secara default. Kebijakan ini harus dinonaktifkan pada perangkat Anda agar tidak bertentangan dengan kebijakan otomotif yang diinginkan dalam CarBluetoothService. Sementara overlay produk Mobil harus menangani hal ini untuk Anda, Anda dapat menonaktifkan kebijakan telepon di overlay resource dengan menetapkan 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 peristiwa yang diketahui perangkat dan prioritas penyambungan ulang profilnya service/src/com/android/car/BluetoothProfileDeviceManager.java.

Selain itu, kebijakan pengelolaan koneksi Bluetooth dapat ditemukan di service/src/com/android/car/BluetoothDeviceConnectionPolicy.java. Secara {i>default<i}, kebijakan ini menentukan instance kapan Bluetooth harus terhubung ke dan memutuskan koneksi dari perangkat. {i>Kernel<i} juga mengelola kasus khusus mobil kapan adaptor harus dinyalakan dan nonaktif.

Buat kebijakan pengelolaan koneksi otomotif kustom Anda sendiri

Jika kebijakan otomotif default tidak memadai untuk kebutuhan Anda, kebijakan otomotif juga dapat dinonaktifkan yang mendukung kebijakan khusus Anda sendiri. Kebijakan khusus Anda, setidaknya, bertanggung jawab untuk menentukan kapan harus mengaktifkan dan menonaktifkan adaptor Bluetooth, serta kapan menghubungkan perangkat. Anda dapat menggunakan berbagai peristiwa untuk mengaktifkan/menonaktifkan Bluetooth dan memulai koneksi perangkat, termasuk peristiwa yang disebabkan oleh perubahan properti mobil.

Nonaktifkan kebijakan otomotif default

Pertama, untuk menggunakan kebijakan kustom, kebijakan otomotif default harus dinonaktifkan oleh menyetel useDefaultBluetoothConnectionPolicy ke false di overlay resource. 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 mengaktifkan dan menonaktifkan adaptor Bluetooth di waktu yang tepat. Anda dapat menggunakan BluetoothAdapter.enable() dan API framework BluetoothAdapter.disable() untuk mengaktifkan dan menonaktifkan adaptor. Panggilan ini harus mengikuti status persisten yang dipilih pengguna melalui Setelan atau sarana 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);
}

Menentukan kapan adaptor Bluetooth diaktifkan dan dinonaktifkan

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

Menentukan kapan harus menghubungkan perangkat

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

Salah satu contoh kasus yang perlu Anda lakukan adalah setiap kali adaptor Bluetooth aktif:

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

Memverifikasi pengelolaan koneksi otomotif

Cara termudah untuk memverifikasi perilaku kebijakan koneksi Anda adalah dengan mengaktifkan Bluetooth dan memvalidasi bahwa IVI secara otomatis terhubung ke perangkat yang benar di urutan yang sesuai. Anda bisa mengaktifkan/menonaktifkan adaptor Bluetooth melalui UI setelan, 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 perintah berikut dapat digunakan untuk melihat informasi debug terkait dengan koneksi Bluetooth:

adb shell dumpsys car_service

Terakhir, jika Anda telah membuat kebijakan otomotif sendiri, memverifikasi setiap koneksi kustom perilaku ini memerlukan pengendalian peristiwa yang telah Anda pilih untuk memicu perangkat koneksi jarak jauh.

Profil Bluetooth otomotif

Di Android, IVI dapat mendukung beberapa perangkat yang terhubung secara bersamaan melalui Bluetooth. Layanan ponsel Bluetooth multiperangkat memungkinkan pengguna terhubung perangkat yang terpisah secara bersamaan, seperti telepon pribadi dan telepon kantor, dan membuat secara handsfree dari salah satu perangkat.

Batas koneksi diberlakukan oleh setiap profil Bluetooth individu, biasanya dalam implementasi layanan profil itu sendiri. Secara {i>default<i}, CarBluetoothService tidak membuat penilaian lebih lanjut tentang jumlah maksimum koneksi perangkat diizinkan.

Profil Handsfree

Profil Hands-Free (HFP) Bluetooth memungkinkan kendaraan membuat dan menerima ponsel panggilan melalui perangkat jarak jauh yang tersambung. Setiap koneksi perangkat mendaftarkan ponsel yang terpisah akun dengan TelecomManager, yang mengiklankan akun telepon 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 HFP simultan koneksi jarak jauh.

Ketika pengguna melakukan atau menerima panggilan telepon dari perangkat, akun ponsel membuat objek HfpClientConnection. Aplikasi Telepon berinteraksi dengan objek HfpClientConnection untuk mengelola panggilan yang berbeda, seperti menerima panggilan atau menutup telepon.

Perlu diperhatikan bahwa aplikasi Telepon default tidak mendukung banyak panggilan secara bersamaan perangkat HFP yang tersambung. Untuk mengimplementasikan HFP multiperangkat, 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 harus memverifikasi bahwa fungsi multiperangkat lainnya juga berfungsi sebagaimana mestinya.

Verifikasi HFP multiperangkat

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

  1. Dengan menggunakan Bluetooth, sambungkan perangkat ke IVI dan streaming audio dari perangkat seluler.
  2. Hubungkan dua ponsel ke IVI melalui Bluetooth.
  3. Pilih satu ponsel. Lakukan panggilan keluar langsung dari ponsel, dan melakukan panggilan keluar menggunakan IVI.
    1. Kedua waktu, verifikasi jeda audio yang di-streaming dan audio ponsel diputar melalui speaker yang tersambung dengan IVI.
  4. Dengan menggunakan ponsel yang sama, terima panggilan masuk langsung di ponsel, dan menerima panggilan masuk menggunakan IVI.
    1. Kedua waktu, verifikasi jeda audio streaming dan audio ponsel diputar melalui speaker yang terhubung IVI.
  5. Ulangi langkah 3 dan 4 dengan ponsel lain yang terhubung.

Panggilan darurat

Kemampuan untuk melakukan panggilan darurat merupakan aspek penting dari telepon dan Fungsi Bluetooth di mobil. Ada sejumlah cara yang dapat dilakukan untuk melakukan panggilan darurat dimulai dari IVI, termasuk:

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

Menghubungkan panggilan darurat

Meskipun peralatan eCall sangat penting bagi keselamatan, peralatan tersebut saat ini belum terintegrasi dengan Android. Dimungkinkan untuk menggunakan ConnectionService untuk mengekspos fitur panggilan darurat melalui Android, yang juga memiliki manfaat penggunaan opsi aksesibilitas untuk panggilan darurat. Untuk mempelajari lebih lanjut, lihat Membuat aplikasi panggilan.

Berikut adalah contoh cara membuat keadaan darurat ConnectionService:

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

Panggilan darurat sebelum Android 10 melibatkan panggilan langsung dari ponsel dan pemanggilan peralatan khusus jika tersedia (misalnya, terpicu secara otomatis saat terdeteksi bahaya atau tindakan pengguna). Di Android 10 dan yang lebih baru, Telepon di mobil dapat langsung memanggil nomor darurat, dengan MAXIMUM_CONNECTED_DEVICES ini dalam 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 menggunakan cara ini, aplikasi lain, seperti pengenalan suara, dapat menghubungi nomor darurat.

Profil Akses Buku Telepon

Profil Akses Buku Telepon (PBAP) Bluetooth mendownload kontak dan histori panggilan dari perangkat jarak jauh yang terhubung. PBAP menyimpan daftar agregat yang dapat ditelusuri berisi kontak yang diperbarui oleh komputer status klien PBAP. Setiap perangkat yang terhubung berinteraksi dengan komputer status klien PBAP terpisah, sehingga kontak menjadi yang terkait dengan perangkat yang tepat saat melakukan panggilan.

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

Selain itu, koneksi profil harus diizinkan oleh IVI dan perangkat seluler agar dapat melakukan koneksi. Ketika klien PBAP terputus, database internal akan menghapus semua kontak dan histori panggilan yang terkait dengan perangkat yang terhubung sebelumnya.

Profil Akses Pesan

Profil Akses Pesan Bluetooth (MAP) memungkinkan kendaraan untuk mengirim dan menerima SMS pesan melalui perangkat jarak jauh yang tersambung. Saat ini, pesan tidak disimpan secara lokal di AI generatif. Sebaliknya, setiap kali perangkat jarak jauh yang terhubung menerima pesan, IVI menerima dan mengurai pesan dan menyiarkan isinya dalam Intent Anda, yang kemudian dapat diterima oleh aplikasi.

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

Profil Distribusi Audio Lanjutan

Profil Distribusi Audio Lanjutan (A2DP) Bluetooth memungkinkan kendaraan untuk menerima streaming audio dari perangkat jarak jauh yang terhubung.

Tidak seperti profil lain, jumlah maksimum perangkat A2DP yang tersambung diberlakukan di pada stack native dan bukan di Java. Nilai saat ini di-hardcode ke 1 menggunakan variabel kDefaultMaxConnectedAudioDevices di packages/modules/Bluetooth/system/btif/src/btif_av.cc.

Profil Remote Control Audio/Video

Profil Remote Control Audio/Video (AVRCP) Bluetooth memungkinkan kendaraan untuk mengontrol dan menjelajahi pemutar media pada perangkat jarak jauh yang tersambung. Karena IVI berperan sebagai pengontrol AVRCP, kontrol apa pun yang dipicu dan mempengaruhi pemutaran audio bergantung pada A2DP yang terhubung ke perangkat target.

Agar pemutar media tertentu di ponsel Android dapat dijelajahi oleh IVI melalui AVRCP, aplikasi media di ponsel harus menyediakan MediaBrowserService dan izinkan akses com.android.bluetooth ke layanan tersebut. Pembuatan layanan browser media akan menjelaskan cara melakukannya secara mendetail.