Menemukan perangkat Bluetooth

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.