Izin Bluetooth baru di Android 12

Android 12 memperkenalkan izin BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, dan BLUETOOTH_CONNECT yang memungkinkan aplikasi Anda memindai perangkat di sekitar tanpa perlu meminta izin lokasi. Aplikasi Anda harus menargetkan Android 12 untuk dapat mendeklarasikan izin ini.

Jika Anda menginginkan kontrol lebih untuk pengalaman penyambungan dan koneksi, gunakan izin yang dijelaskan di halaman ini.

Mendeklarasikan izin baru

Jika aplikasi Anda berinteraksi dengan perangkat Bluetooth, sebaiknya lakukan hal berikut:

  1. Jika aplikasi Anda mencari perangkat Bluetooth, seperti periferal Bluetooth hemat energi (BLE), tambahkan izin BLUETOOTH_SCAN ke manifes aplikasi.
  2. Jika aplikasi Anda membuat perangkat saat ini dapat ditemukan oleh perangkat Bluetooth lain, tambahkan izin BLUETOOTH_ADVERTISE ke manifes aplikasi Anda.
  3. Jika aplikasi Anda berkomunikasi dengan perangkat Bluetooth yang sudah disambungkan, tambahkan izin BLUETOOTH_CONNECT ke manifes aplikasi Anda.
  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 Anda yang diperlukan saat diinstal di perangkat yang menjalankan Android 12.

Cuplikan kode berikut menunjukkan cara mendeklarasikan izin baru ini di aplikasi Anda:

<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.
         You must add an attribute to this permission, or declare the
         ACCESS_FINE_LOCATION permission, depending on the results when you
         check location usage in your app. -->
    <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" />
    ...
</manifest>
Gambar 1. Dialog izin sistem yang meminta pengguna memberikan izin kepada aplikasi untuk menemukan, mengiklankan, dan terhubung ke perangkat \ terdekat.

Dialog yang dilihat pengguna

Izin BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, dan BLUETOOTH_CONNECT merupakan izin waktu proses. Oleh karena itu, Anda harus secara eksplisit meminta persetujuan pengguna di aplikasi sebelum dapat mencari perangkat Bluetooth, membuat perangkat dapat ditemukan di perangkat lain, atau berkomunikasi dengan perangkat Bluetooth lain yang sudah disambungkan.

Saat aplikasi meminta setidaknya salah satu izin Bluetooth baru, sistem akan meminta pengguna untuk mengizinkan aplikasi Anda mengakses Perangkat di sekitar, seperti yang ditunjukkan pada gambar 1.

Mempertimbangkan cara penggunaan hasil pemindaian

Pertimbangkan dengan baik-baik apakah aplikasi Anda menggunakan hasil pemindaian Bluetooth untuk mendapatkan lokasi perangkat. Selesaikan langkah-langkah di salah satu bagian berikut sesuai dengan jawaban Anda:

Aplikasi tidak mendapatkan lokasi fisik

Jika aplikasi tidak mendapatkan lokasi fisik, Anda dapat membuat pernyataan tegas bahwa aplikasi tidak pernah menggunakan izin Bluetooth untuk mendapatkan lokasi fisik. Caranya, ikuti 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>
    <!-- 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" />

    <!-- 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" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- 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. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

Aplikasi memperoleh lokasi fisik

Jika aplikasi Anda benar-benar memperoleh lokasi fisik, Anda harus terus mendeklarasikan izin ACCESS_FINE_LOCATION dalam manifes aplikasi Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:

<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" />

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Required if your app derives physical location from Bluetooth
         scan results. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>