Menemukan perangkat Bluetooth

Dengan BluetoothAdapter, Anda dapat menemukan perangkat Bluetooth jarak jauh melalui penemuan perangkat atau dengan membuat kueri 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 perangkat berkemampuan Bluetooth dan meminta beberapa informasi tentang setiap perangkat. Proses ini terkadang disebut sebagai menemukan, menanyakan, atau memindai. Perangkat Bluetooth di sekitar akan merespons permintaan penemuan hanya jika saat ini perangkat tersebut menerima permintaan informasi dengan dapat ditemukan. Jika dapat ditemukan, perangkat akan merespons permintaan penemuan dengan membagikan beberapa informasi, seperti nama perangkat, class, dan alamat MAC uniknya. Dengan menggunakan informasi ini, perangkat yang melakukan proses penemuan dapat memilih untuk memulai koneksi ke perangkat yang ditemukan.

Karena perangkat yang dapat ditemukan mungkin 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 baru, sebaiknya gunakan API Pengelola Perangkat Pendamping. 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, 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 dengan perangkat tersebut kapan saja tanpa melakukan penemuan, dengan asumsi perangkat tersebut masih dalam jangkauan.

Ingat bahwa ada perbedaan antara yang disambungkan dan yang dihubungkan:

  • Disambungkan berarti dua perangkat saling mengetahui keberadaan masing-masing, memiliki kunci link bersama yang dapat digunakan untuk autentikasi, dan dapat saling membuat koneksi terenkripsi.
  • Terhubung berarti perangkat saat ini berbagi saluran RFCOMM dan dapat saling mengirim data. Bluetooth API saat ini mengharuskan perangkat untuk disambungkan sebelum koneksi RFCOMM dapat dibuat. Penyambungan secara otomatis dilakukan saat Anda memulai koneksi yang dienkripsi 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 membuat 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, semua 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 atau tidak. Proses penemuan biasanya melibatkan pemindaian pemeriksaan 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 kemudian 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() pada BluetoothDevice untuk mengambil alamat MAC yang terkait.

Aktifkan visibilitas

Agar perangkat lokal dapat ditemukan oleh perangkat lain, panggil startActivityForResult(Intent, int) dengan intent ACTION_REQUEST_DISCOVERABLE. Tindakan ini mengeluarkan permintaan untuk mengaktifkan mode dapat ditemukan sistem tanpa harus membuka aplikasi Setelan, yang akan menghentikan aplikasi Anda. Secara default, perangkat dapat ditemukan selama dua menit. Anda dapat menentukan durasi yang berbeda, hingga satu jam, dengan menambahkan tambahan EXTRA_DISCOVERABLE_DURATION.

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: Mengaktifkan dialog visibilitas.

Dialog akan ditampilkan, yang meminta izin pengguna agar perangkat dapat ditemukan, seperti yang ditunjukkan pada gambar 2. Jika pengguna merespons "Izinkan", perangkat dapat ditemukan selama jangka waktu tertentu. 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 diberi tahu saat mode 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. Nilai yang memungkinkan 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 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.