Dengan menggunakan BluetoothAdapter
,
Anda dapat menemukan perangkat Bluetooth jarak jauh melalui penemuan perangkat atau dengan
mengkueri daftar perangkat yang disambungkan.
Pastikan Anda memiliki izin Bluetooth yang sesuai dan menyiapkan aplikasi untuk Bluetooth sebelum mencoba menemukan perangkat Bluetooth.
Penemuan perangkat adalah prosedur pemindaian yang menelusuri area lokal untuk menemukan perangkat yang kompatibel dengan Bluetooth dan meminta beberapa informasi tentang setiap perangkat. Proses ini terkadang disebut sebagai menemukan, menginterogasi, atau memindai. Perangkat Bluetooth di sekitar merespons permintaan penemuan hanya jika saat ini menerima permintaan informasi dengan dapat ditemukan. Jika dapat ditemukan, perangkat akan merespons permintaan penemuan dengan membagikan beberapa informasi, seperti nama perangkat, class-nya, dan alamat MAC uniknya. Dengan menggunakan informasi ini, perangkat yang melakukan proses penemuan kemudian dapat memilih untuk memulai koneksi ke perangkat yang ditemukan.
Karena perangkat yang dapat ditemukan dapat mengungkapkan informasi tentang lokasi pengguna, proses penemuan perangkat memerlukan akses lokasi. Jika aplikasi Anda digunakan di perangkat yang menjalankan Android 8.0 (API level 26) atau yang lebih tinggi, sebaiknya gunakan Companion Device Manager API. API ini melakukan penemuan perangkat atas nama aplikasi Anda, sehingga aplikasi Anda tidak perlu meminta izin akses lokasi.
Setelah koneksi dibuat dengan perangkat jarak jauh untuk pertama kalinya, permintaan penyambungan akan otomatis ditampilkan kepada pengguna. Saat perangkat disambungkan, informasi dasar tentang perangkat tersebut—seperti nama, class, dan alamat MAC perangkat—akan disimpan dan dapat dibaca menggunakan Bluetooth API. Dengan menggunakan alamat MAC yang diketahui untuk perangkat jarak jauh, koneksi dapat dimulai kapan saja tanpa melakukan penemuan, dengan asumsi perangkat masih dalam jangkauan.
Ingat bahwa ada perbedaan antara yang disambungkan dan yang dihubungkan:
- Disambungkan berarti dua perangkat mengetahui keberadaan satu sama lain, memiliki kunci link bersama yang dapat digunakan untuk autentikasi, dan mampu membuat koneksi terenkripsi satu sama lain.
- Terhubung berarti perangkat saat ini berbagi saluran RFCOMM dan dapat saling mengirimkan data. API Bluetooth saat ini mengharuskan perangkat disambungkan sebelum koneksi RFCOMM dapat dibuat. Penyambungan dilakukan secara otomatis saat Anda memulai koneksi terenkripsi dengan Bluetooth API.
Bagian berikut menjelaskan cara menemukan perangkat yang telah disambungkan dan cara menemukan perangkat baru menggunakan penemuan perangkat.
Melakukan kueri perangkat yang disambungkan
Sebelum melakukan penemuan perangkat, sebaiknya buat kueri kumpulan perangkat
yang disambungkan untuk melihat apakah perangkat yang diinginkan sudah diketahui. Untuk melakukannya,
panggil getBondedDevices()
Tindakan ini akan menampilkan kumpulan
objek BluetoothDevice
yang mewakili perangkat yang disambungkan. Misalnya, Anda dapat membuat kueri untuk semua perangkat yang disambungkan dan
mendapatkan nama serta alamat MAC setiap perangkat, seperti yang ditunjukkan cuplikan kode
berikut:
Kotlin
val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices pairedDevices?.forEach { device -> val deviceName = device.name val deviceHardwareAddress = device.address // MAC address }
Java
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { // There are paired devices. Get the name and address of each paired device. for (BluetoothDevice device : pairedDevices) { String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address } }
Untuk memulai koneksi dengan perangkat Bluetooth, yang diperlukan dari
objek BluetoothDevice
terkait adalah alamat MAC, yang Anda ambil dengan
memanggil
getAddress()
. Anda
dapat mempelajari lebih lanjut cara membuat koneksi di Menghubungkan perangkat
Bluetooth.
Menemukan perangkat
Untuk mulai menemukan perangkat, panggil
startDiscovery()
.
Proses ini bersifat asinkron dan menampilkan nilai boolean yang menunjukkan apakah
penemuan berhasil dimulai. Proses penemuan biasanya melibatkan
pemindaian permintaan sekitar 12 detik, diikuti dengan pemindaian halaman setiap perangkat yang ditemukan
untuk mengambil nama Bluetooth-nya.
Untuk menerima informasi tentang setiap perangkat yang ditemukan, aplikasi Anda harus mendaftarkan
BroadcastReceiver
untuk
intent
ACTION_FOUND
. Sistem menyiarkan intent ini untuk setiap perangkat. Intent berisi
kolom tambahan
EXTRA_DEVICE
dan
EXTRA_CLASS
, yang
pada gilirannya berisi BluetoothDevice
dan
BluetoothClass
.
Cuplikan kode berikut menunjukkan cara mendaftar untuk menangani siaran
saat perangkat ditemukan:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... // Register for broadcasts when a device is discovered. val filter = IntentFilter(BluetoothDevice.ACTION_FOUND) registerReceiver(receiver, filter) } // Create a BroadcastReceiver for ACTION_FOUND. private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action: String = intent.action when(action) { BluetoothDevice.ACTION_FOUND -> { // Discovery has found a device. Get the BluetoothDevice // object and its info from the Intent. val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) val deviceName = device.name val deviceHardwareAddress = device.address // MAC address } } } } override fun onDestroy() { super.onDestroy() ... // Don't forget to unregister the ACTION_FOUND receiver. unregisterReceiver(receiver) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { ... // Register for broadcasts when a device is discovered. IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); } // Create a BroadcastReceiver for ACTION_FOUND. private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Discovery has found a device. Get the BluetoothDevice // object and its info from the Intent. BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address } } }; @Override protected void onDestroy() { super.onDestroy(); ... // Don't forget to unregister the ACTION_FOUND receiver. unregisterReceiver(receiver); }
Untuk memulai koneksi dengan perangkat Bluetooth, Anda memanggil getAddress()
di
BluetoothDevice
untuk mengambil alamat MAC terkait.
Aktifkan visibilitas
Agar perangkat lokal dapat ditemukan oleh perangkat lain, panggil
startActivityForResult(Intent, int)
dengan
intent
ACTION_REQUEST_DISCOVERABLE
. Tindakan ini akan mengeluarkan permintaan untuk mengaktifkan mode yang dapat ditemukan sistem tanpa
harus membuka aplikasi Setelan, yang akan menghentikan aplikasi Anda sendiri. Secara
default, perangkat dapat ditemukan selama dua menit. Anda dapat menentukan
durasi yang berbeda, hingga lima menit, dengan menambahkan
EXTRA_DISCOVERABLE_DURATION
tambahan.
Cuplikan kode berikut menetapkan perangkat agar dapat ditemukan selama lima menit:
Kotlin
val requestCode = 1; val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply { putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300) } startActivityForResult(discoverableIntent, requestCode)
Java
int requestCode = 1; Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivityForResult(discoverableIntent, requestCode);
Gambar 2: Dialog pengaktifan visibilitas.
Dialog akan ditampilkan, yang meminta izin pengguna untuk membuat perangkat
dapat ditemukan, seperti yang ditunjukkan pada gambar 2. Jika pengguna merespons "Izinkan", perangkat
akan dapat ditemukan selama jangka waktu yang ditentukan. Aktivitas Anda kemudian
menerima panggilan ke
callback
onActivityResult()
, dengan kode hasil yang sama dengan durasi perangkat
dapat ditemukan. Jika pengguna merespons "Tolak", atau jika terjadi error, kode
hasilnya adalah RESULT_CANCELED
.
Perangkat tersebut diam-diam akan tetap dalam mode dapat ditemukan untuk waktu yang telah ditentukan. Agar
mendapatkan notifikasi saat mode yang dapat ditemukan telah berubah, daftarkan BroadcastReceiver
untuk
intent
ACTION_SCAN_MODE_CHANGED
. Intent ini berisi kolom tambahan
EXTRA_SCAN_MODE
dan
EXTRA_PREVIOUS_SCAN_MODE
,
yang masing-masing menyediakan mode pemindaian baru dan lama. Kemungkinan nilai untuk setiap
tambahan adalah sebagai berikut:
SCAN_MODE_CONNECTABLE_DISCOVERABLE
- Perangkat dalam mode yang dapat ditemukan.
SCAN_MODE_CONNECTABLE
- Perangkat tidak dalam mode yang dapat ditemukan, tetapi masih dapat menerima koneksi.
SCAN_MODE_NONE
- Perangkat tidak dalam mode yang dapat ditemukan dan tidak dapat menerima koneksi.
Jika memulai koneksi ke perangkat jarak jauh, Anda tidak perlu mengaktifkan visibilitas perangkat. Mengaktifkan visibilitas hanya diperlukan jika Anda ingin aplikasi menghosting soket server yang menerima koneksi masuk, karena perangkat jarak jauh harus dapat menemukan perangkat lain sebelum memulai koneksi ke perangkat lain tersebut.