Dengan menggunakan BluetoothAdapter
,
Anda dapat menemukan perangkat Bluetooth jarak jauh
melalui penemuan perangkat atau dengan
membuat kueri daftar perangkat
yang disambungkan.
Memastikan Anda memiliki izin Bluetooth yang sesuai dan menyiapkan aplikasi Anda untuk Bluetooth sebelum mencoba menemukan perangkat Bluetooth.
Penemuan perangkat adalah prosedur pemindaian yang mencari area lokal untuk Perangkat berkemampuan Bluetooth dan meminta beberapa informasi tentang setiap perangkat tersebut. Ini proses ini kadang disebut sebagai menemukan, menanyakan, atau memindai. Perangkat Bluetooth di sekitar merespons permintaan penemuan hanya jika saat ini menerima permintaan informasi dengan cara dapat ditemukan. Jika perangkat dapat ditemukan, ia merespons permintaan penemuan dengan membagikan beberapa informasi, seperti nama perangkat, kelasnya, dan alamat MAC yang unik. Dengan menggunakan informasi, perangkat yang menjalankan proses penemuan 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 sedang digunakan pada perangkat yang menjalankan Android 8.0 (API level 26) atau yang lebih tinggi, pertimbangkan untuk menggunakan Pengelola Perangkat Pendamping API sebagai gantinya. API ini melakukan penemuan perangkat atas nama aplikasi Anda, sehingga aplikasi tidak perlu meminta izin akses lokasi.
Setelah koneksi dibuat dengan perangkat jarak jauh untuk pertama kalinya, penyambungan otomatis ditampilkan kepada pengguna. Saat perangkat dipasangkan, informasi dasar tentang perangkat tersebut—seperti nama, class, dan MAC perangkat disimpan dan dapat dibaca menggunakan Bluetooth API. Menggunakan MAC yang diketahui untuk perangkat jarak jauh, koneksi dapat dimulai dengan perangkat tersebut 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 saling mengetahui keberadaan satu sama lain, memiliki kunci tautan bersama yang dapat digunakan untuk otentikasi, dan mampu membuat koneksi terenkripsi satu sama lain.
- Terhubung berarti perangkat saat ini berbagi saluran RFCOMM dan dapat saling mengirimkan data satu sama lain. Bluetooth saat ini API mengharuskan perangkat untuk disambungkan sebelum koneksi RFCOMM mapan. Penyambungan dilakukan secara otomatis ketika Anda memulai 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, ada baiknya
Anda membuat kueri kumpulan
untuk melihat apakah perangkat yang diinginkan sudah dikenal. Untuk melakukannya,
panggil getBondedDevices()
Proses ini akan mengembalikan sekumpulan
Objek BluetoothDevice
yang merepresentasikan perangkat
yang disambungkan. Misalnya, Anda dapat melakukan kueri semua
perangkat yang disambungkan dan
dapatkan nama dan alamat MAC dari setiap perangkat, seperti cuplikan kode berikut
mendemonstrasikan:
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, semua yang diperlukan dari
objek BluetoothDevice
terkait adalah alamat MAC, yang Anda ambil dengan
menelepon
getAddress()
. Anda
dapat mempelajari lebih lanjut cara membuat koneksi di artikel Menghubungkan Bluetooth
perangkat.
Menemukan perangkat
Untuk mulai menemukan perangkat, panggil
startDiscovery()
Proses ini asinkron dan mengembalikan nilai boolean yang menunjukkan apakah
penemuan telah berhasil dimulai. Proses penemuan biasanya melibatkan
pemindaian pertanyaan sekitar 12 detik, diikuti dengan pemindaian halaman dari setiap perangkat yang ditemukan
untuk mengambil nama Bluetooth-nya.
Untuk menerima informasi tentang setiap perangkat yang ditemukan, aplikasi Anda harus mendaftarkan
BroadcastReceiver
untuk
ACTION_FOUND
intent. Sistem menyiarkan intent ini untuk setiap perangkat. Intent berisi
kolom tambahan
EXTRA_DEVICE
dan
EXTRA_CLASS
, yang
pada gilirannya akan 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, panggil getAddress()
di
BluetoothDevice
untuk mengambil alamat MAC yang terkait.
Aktifkan visibilitas
Agar perangkat lokal dapat ditemukan oleh perangkat lain, panggil
startActivityForResult(Intent, int)
dengan
ACTION_REQUEST_DISCOVERABLE
intent. Pesan ini mengeluarkan permintaan untuk mengaktifkan mode
yang dapat ditemukan pada sistem tanpa
harus menavigasi ke aplikasi {i>Settings<i}, yang akan
menghentikan aplikasi Anda sendiri. Menurut
secara default, perangkat bisa ditemukan selama dua menit. Anda dapat menentukan
dengan durasi yang berbeda, hingga satu jam, 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.
Sebuah dialog akan ditampilkan, meminta izin pengguna untuk membuat perangkat
dapat ditemukan, seperti yang ditunjukkan pada gambar 2. Jika pengguna merespons "Izinkan", maka
perangkat menjadi dapat ditemukan selama
jangka waktu yang ditentukan. Aktivitas Anda kemudian
menerima panggilan ke
onActivityResult()
, dengan kode hasil yang sama dengan durasi perangkat
dapat ditemukan. Jika pengguna merespons "Tolak", atau terjadi error, hasilnya
kodenya adalah RESULT_CANCELED
.
Perangkat tersebut diam-diam akan tetap dalam mode dapat ditemukan untuk waktu yang telah ditentukan. Untuk menjadi
diberi tahu saat mode dapat ditemukan telah berubah, daftarkan BroadcastReceiver
untuk
ACTION_SCAN_MODE_CHANGED
intent. Intent ini berisi kolom tambahan
EXTRA_SCAN_MODE
dan
EXTRA_PREVIOUS_SCAN_MODE
,
yang masing-masing menyediakan mode
pemindaian baru dan lama. Nilai yang mungkin untuk setiap
tambahan adalah sebagai berikut:
SCAN_MODE_CONNECTABLE_DISCOVERABLE
- Perangkat dalam mode dapat ditemukan.
SCAN_MODE_CONNECTABLE
- Perangkat tidak dalam mode dapat ditemukan, tetapi masih dapat menerima koneksi.
SCAN_MODE_NONE
- Perangkat tidak dalam mode dapat ditemukan dan tidak dapat menerima koneksi.
Jika Anda memulai koneksi ke perangkat jarak jauh, Anda tidak perlu mengaktifkan visibilitas perangkat. Mengaktifkan visibilitas hanya diperlukan saat Anda ingin aplikasi Anda menghosting soket server yang menerima koneksi jarak jauh, karena perangkat jarak jauh harus dapat menemukan perangkat lain sebelum memulai koneksi ke perangkat lain tersebut.