Izin Bluetooth

Untuk menggunakan fitur Bluetooth di aplikasi, Anda harus mendeklarasikan beberapa izin. Anda juga harus menentukan apakah aplikasi Anda memerlukan dukungan untuk Bluetooth klasik atau Bluetooth Hemat Energi (BLE). Jika aplikasi Anda tidak memerlukan Bluetooth klasik atau BLE, tetapi masih dapat memanfaatkan teknologi ini, Anda dapat memeriksa ketersediaan saat runtime.

Mendeklarasikan izin

Kumpulan izin yang Anda deklarasikan di aplikasi bergantung pada versi SDK target aplikasi Anda.

Menargetkan Android 12 atau yang lebih baru

Catatan: Di Android 8.0 (API level 26) dan yang lebih tinggi, Pengelola Perangkat Pendamping (CDM) menyediakan metode yang lebih sederhana untuk terhubung ke perangkat pendamping, dibandingkan dengan izin yang dijelaskan di bagian ini. Sistem CDM menyediakan UI penyambungan atas nama aplikasi Anda dan tidak memerlukan izin akses lokasi.

Jika Anda menginginkan kontrol lebih besar atas pengalaman penyambungan dan koneksi, gunakan izin yang dijelaskan di bagian ini.

Dialog izin Bluetooth
Dialog izin sistem, yang meminta pengguna memberikan izin kepada aplikasi untuk menemukan, mengiklankan, dan terhubung ke perangkat di sekitar.

Jika aplikasi menargetkan Android 12 (API level 31) atau yang lebih baru, deklarasikan izin berikut dalam file manifes aplikasi Anda:

  1. Jika aplikasi Anda mencari perangkat Bluetooth, seperti periferal BLE, deklarasikan izin BLUETOOTH_SCAN.
  2. Jika aplikasi Anda membuat perangkat saat ini dapat ditemukan oleh perangkat Bluetooth lainnya, deklarasikan izin BLUETOOTH_ADVERTISE.
  3. Jika aplikasi Anda berkomunikasi dengan perangkat Bluetooth yang sudah disambungkan, deklarasikan izin BLUETOOTH_CONNECT.
  4. Untuk deklarasi izin terkait Bluetooth lama Anda, tetapkan android:maxSdkVersion ke 30. Langkah kompatibilitas aplikasi ini membantu sistem hanya memberikan izin Bluetooth ke aplikasi yang diperlukan saat diinstal di perangkat yang menjalankan Android 12 atau yang lebih tinggi.
  5. Jika aplikasi Anda menggunakan hasil pemindaian Bluetooth untuk mendapatkan lokasi fisik, deklarasikan izin ACCESS_FINE_LOCATION. Jika tidak, Anda dapat menyatakan dengan kuat bahwa aplikasi Anda tidak memperoleh lokasi fisik.

Izin BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT, dan BLUETOOTH_SCAN merupakan izin waktu proses. Oleh karena itu, Anda harus secara eksplisit meminta persetujuan pengguna di aplikasi Anda sebelum dapat mencari perangkat Bluetooth, membuat perangkat dapat ditemukan oleh perangkat lain, atau berkomunikasi dengan perangkat Bluetooth yang sudah disambungkan. Jika aplikasi meminta setidaknya salah satu izin ini, sistem akan meminta pengguna untuk mengizinkan aplikasi Anda mengakses Perangkat di sekitar, seperti ditunjukkan pada gambar 1.

Cuplikan kode berikut menunjukkan cara mendeklarasikan izin terkait Bluetooth di aplikasi Anda jika aplikasi menargetkan Android 12 atau yang lebih tinggi:

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Needed only if your app looks for Bluetooth devices.
         If your app doesn't use Bluetooth scan results to derive physical
         location information, you can
         <a href="#assert-never-for-location">strongly assert that your app
         doesn't derive physical location</a>. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

    <!-- Needed only if your app makes the device discoverable to Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

    <!-- Needed only if your app communicates with already-paired Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Needed only if your app uses Bluetooth scan results to derive physical location. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

Tegaskan dengan jelas bahwa aplikasi Anda tidak memperoleh lokasi fisik

Jika aplikasi tidak menggunakan hasil pemindaian Bluetooth untuk mendapatkan lokasi fisik, Anda dapat membuat pernyataan kuat bahwa aplikasi Anda tidak pernah menggunakan izin Bluetooth untuk mendapatkan lokasi fisik. Caranya, selesaikan langkah-langkah berikut:

  1. Tambahkan atribut android:usesPermissionFlags ke deklarasi izin BLUETOOTH_SCAN, lalu tetapkan nilai atribut ke neverForLocation.

  2. Jika lokasi tidak diperlukan untuk aplikasi Anda, hapus izin ACCESS_FINE_LOCATION dari manifes aplikasi Anda.

Cuplikan kode berikut menunjukkan cara memperbarui file manifes aplikasi Anda:

<manifest>
    <!-- Include "neverForLocation" only if you can strongly assert that
         your app never derives physical location from Bluetooth scan results. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />

    <!-- Not needed if you can strongly assert that your app never derives
         physical location from Bluetooth scan results and doesn't need location
         access for any other purpose. -->
    <strike><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></strike>
    ...
</manifest>

Menargetkan Android 11 atau yang lebih rendah

Jika aplikasi Anda menargetkan Android 11 (API level 30) atau yang lebih rendah, deklarasikan izin berikut dalam file manifes aplikasi Anda:

  • BLUETOOTH diperlukan untuk melakukan komunikasi Bluetooth klasik atau BLE, seperti meminta koneksi, menerima koneksi, dan mentransfer data.
  • ACCESS_FINE_LOCATION diperlukan karena pada Android 11 dan yang lebih rendah, pemindaian Bluetooth dapat berpotensi digunakan untuk mengumpulkan informasi tentang lokasi pengguna.

Karena izin akses lokasi adalah izin runtime, Anda harus meminta izin ini saat runtime beserta mendeklarasikannya dalam manifes.

Menemukan perangkat Bluetooth lokal

Jika ingin aplikasi memulai penemuan perangkat atau memanipulasi setelan Bluetooth, Anda harus mendeklarasikan izin BLUETOOTH_ADMIN. Sebagian besar aplikasi memerlukan izin ini agar dapat menemukan perangkat Bluetooth lokal. Jangan gunakan kemampuan lain yang diberikan oleh izin ini, kecuali jika aplikasi tersebut adalah "power manager" yang mengubah setelan Bluetooth atas permintaan pengguna. Deklarasikan izin di file manifes aplikasi Anda. Contoh:

<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>

Jika aplikasi Anda mendukung layanan dan dapat berjalan di Android 10 (API level 29) atau Android 11, Anda juga harus mendeklarasikan izin ACCESS_BACKGROUND_LOCATION untuk menemukan perangkat Bluetooth. Untuk mengetahui informasi selengkapnya tentang persyaratan ini, lihat Mengakses lokasi di latar belakang.

Cuplikan kode berikut menunjukkan cara mendeklarasikan izin ACCESS_BACKGROUND_LOCATION:

<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
...
</manifest>

Lihat referensi <uses-permission> untuk mengetahui informasi selengkapnya tentang mendeklarasikan izin aplikasi.

Menentukan penggunaan fitur Bluetooth

Jika Bluetooth merupakan bagian penting dari aplikasi, Anda dapat menambahkan flag ke file manifes yang menunjukkan persyaratan ini. Elemen <uses-feature> memungkinkan Anda menentukan jenis hardware yang digunakan aplikasi Anda dan apakah diperlukan atau tidak.

Contoh ini menunjukkan cara menunjukkan bahwa Bluetooth klasik diperlukan untuk aplikasi Anda.

<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>

Jika aplikasi Anda mengandalkan Bluetooth Hemat Energi, Anda dapat menggunakan hal berikut:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

Jika Anda menyatakan bahwa fitur tersebut diperlukan untuk aplikasi, Google Play Store akan menyembunyikan aplikasi dari pengguna pada perangkat yang tidak memiliki fitur tersebut. Karena alasan ini, Anda hanya boleh menetapkan atribut yang diperlukan ke true jika aplikasi tidak dapat berfungsi tanpa fitur tersebut.

Memeriksa ketersediaan fitur saat runtime

Agar aplikasi Anda tersedia untuk perangkat yang tidak mendukung Bluetooth klasik atau BLE, Anda tetap harus menyertakan elemen <uses-feature> dalam manifes aplikasi Anda, tetapi tetapkan required="false". Kemudian, pada saat runtime, Anda dapat menentukan ketersediaan fitur menggunakan PackageManager.hasSystemFeature():

Kotlin

// Check to see if the Bluetooth classic feature is available.
val bluetoothAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)

// Check to see if the BLE feature is available.
val bluetoothLEAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)

Java

// Use this check to determine whether Bluetooth classic is supported on the device.
// Then you can selectively disable BLE-related features.
boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
boolean bluetoothLEAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);