Saat suatu fitur di aplikasi Anda memerlukan akses lokasi, tunggu hingga pengguna berinteraksi dengan fitur tersebut sebelum membuat permintaan izin. Alur kerja ini mengikuti praktik terbaik untuk meminta izin runtime dalam konteks, seperti yang dijelaskan dalam panduan yang menjelaskan cara meminta izin aplikasi.
Gambar 1 menunjukkan contoh cara melakukan proses ini. Aplikasi ini berisi fitur "berbagi lokasi" yang memerlukan akses lokasi latar depan. Namun, aplikasi tidak meminta izin akses lokasi, sampai pengguna memilih tombol Bagikan lokasi.
Pengguna hanya dapat memberikan perkiraan lokasi
Di Android 12 (API level 31) atau yang lebih baru, pengguna dapat meminta agar aplikasi Anda hanya
mengambil informasi perkiraan lokasi, meskipun saat aplikasi meminta
izin runtime ACCESS_FINE_LOCATION
.
Untuk menangani perilaku pengguna yang mungkin terjadi ini, jangan meminta izin ACCESS_FINE_LOCATION
saja. Sebagai gantinya, minta izin ACCESS_FINE_LOCATION
dan izin ACCESS_COARSE_LOCATION
dalam satu permintaan
runtime. Jika Anda mencoba meminta ACCESS_FINE_LOCATION
saja, sistem akan mengabaikan
permintaan tersebut pada beberapa rilis Android 12. Jika aplikasi Anda menargetkan
Android 12 atau yang lebih tinggi, sistem akan mencatat pesan error berikut
di Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Saat aplikasi Anda meminta ACCESS_FINE_LOCATION
dan ACCESS_COARSE_LOCATION
,
dialog izin sistem menyertakan opsi baru berikut untuk pengguna:
- Akurat: Memungkinkan aplikasi Anda mendapatkan informasi lokasi akurat.
- Perkiraan: Memungkinkan aplikasi Anda hanya mendapatkan informasi perkiraan lokasi.
Gambar 3 menunjukkan bahwa dialog berisi tanda visual untuk kedua opsi, guna membantu pengguna memilih. Setelah memutuskan keakuratan lokasi, pengguna akan mengetuk salah satu dari tiga tombol untuk memilih durasi pemberian izin.
Pada Android 12 dan yang lebih baru, pengguna dapat membuka setelan sistem untuk menyetel akurasi lokasi pilihan untuk aplikasi apa pun, terlepas dari versi SDK yang menjadi target aplikasi tersebut. Hal ini berlaku meskipun aplikasi Anda diinstal di perangkat yang menjalankan Android 11 atau yang lebih lama, lalu pengguna mengupgrade perangkat ke Android 12 atau yang lebih baru.
Pilihan pengguna memengaruhi pemberian izin
Tabel berikut menunjukkan izin yang diberikan sistem ke aplikasi Anda, berdasarkan opsi yang dipilih pengguna dalam dialog runtime izin:
Akurat | Perkiraan | |
---|---|---|
Saat aplikasinya digunakan | ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Hanya kali ini | ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Tolak | Tidak ada izin lokasi | Tidak ada izin lokasi |
Untuk mengetahui izin yang telah diberikan sistem kepada aplikasi, periksa nilai yang dihasilkan permintaan izin. Anda dapat menggunakan library Jetpack dalam kode yang mirip dengan contoh berikut, atau menggunakan library platform, tempat Anda mengelola sendiri kode permintaan izin.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
Meminta upgrade ke lokasi akurat
Anda dapat meminta pengguna untuk mengupgrade akses aplikasi dari perkiraan lokasi ke
lokasi akurat. Sebelum meminta pengguna untuk mengupgrade akses aplikasi ke lokasi akurat,
pertimbangkan apakah kasus penggunaan aplikasi benar-benar memerlukan tingkat
ketepatan ini. Jika aplikasi perlu menyambungkan sebuah perangkat dengan perangkat di sekitar
melalui Bluetooth atau Wi-Fi, pertimbangkan untuk menggunakan penyambungan
perangkat pendamping
atau izin Bluetooth, daripada
meminta izin ACCESS_FINE_LOCATION
.
Untuk meminta pengguna meng-upgrade akses lokasi aplikasi dari perkiraan ke akurat, lakukan hal berikut:
- Jika perlu, jelaskan alasan aplikasi Anda memerlukan izin.
- Minta izin
ACCESS_FINE_LOCATION
danACCESS_COARSE_LOCATION
lagi. Karena pengguna telah mengizinkan sistem untuk memberikan perkiraan lokasi ke aplikasi Anda, dialog sistem kali ini berbeda, seperti yang ditunjukkan pada gambar 4 dan gambar 5:
Meminta hanya lokasi latar depan terlebih dahulu
Meskipun beberapa fitur di aplikasi Anda memerlukan akses lokasi, mungkin saja hanya beberapa di antaranya yang memerlukan akses lokasi latar belakang. Oleh karena itu, sebaiknya aplikasi Anda menjalankan permintaan inkremental untuk izin lokasi, yang meminta akses lokasi latar depan, lalu akses lokasi latar belakang. Dengan melakukan permintaan inkremental, Anda memberikan lebih banyak kontrol dan transparansi kepada pengguna karena mereka dapat lebih memahami fitur mana di aplikasi Anda yang memerlukan akses lokasi latar belakang.
Gambar 6 menunjukkan contoh aplikasi yang didesain untuk menangani permintaan inkremental. Fitur "tampilkan lokasi saat ini" dan "rekomendasikan tempat-tempat terdekat" memerlukan akses lokasi latar depan. Namun, hanya fitur "rekomendasikan tempat-tempat terdekat" yang memerlukan akses lokasi latar belakang.
Proses untuk melakukan permintaan inkremental adalah sebagai berikut:
Pada awalnya, aplikasi Anda harus memandu pengguna ke fitur yang memerlukan akses lokasi latar depan, seperti fitur "berbagi lokasi" pada Gambar 1 atau fitur "tampilkan lokasi saat ini" pada Gambar 2.
Sebaiknya Anda menonaktifkan akses pengguna ke fitur yang memerlukan akses lokasi latar belakang hingga aplikasi memiliki akses lokasi latar depan.
Nantinya, saat pengguna menjelajahi fitur yang memerlukan akses lokasi latar belakang, Anda dapat meminta akses lokasi latar belakang.
Referensi lainnya
Untuk mengetahui informasi selengkapnya tentang izin akses lokasi di Android, lihat materi berikut:
Codelab
Video
Contoh
- Aplikasi contoh untuk menunjukkan penggunaan izin akses lokasi.