Untuk melindungi privasi pengguna, aplikasi yang menggunakan layanan lokasi harus meminta izin akses lokasi.
Saat Anda meminta izin akses lokasi, ikuti praktik terbaik yang sama seperti yang Anda lakukan untuk izin runtime lainnya. Satu perbedaan penting mengenai izin akses lokasi adalah bahwa sistem tidak hanya memiliki satu izin saja yang terkait dengan lokasi, melainkan beberapa. Izin mana yang Anda minta, dan cara memintanya, bergantung pada persyaratan lokasi untuk kasus penggunaan aplikasi Anda.
Halaman ini menjelaskan berbagai jenis persyaratan lokasi dan memberikan panduan cara meminta izin akses lokasi dalam setiap kasus.
Jenis akses lokasi
Setiap izin memiliki kombinasi karakteristik berikut:
- Kategori: Lokasi latar depan atau lokasi latar belakang.
- Akurasi: Lokasi akurat atau perkiraan lokasi.
Lokasi latar depan
Jika aplikasi Anda berisi fitur yang membagikan atau menerima informasi lokasi satu kali saja atau selama jangka waktu yang ditentukan, maka fitur tersebut memerlukan akses lokasi latar depan. Berikut beberapa contohnya:
- Pada aplikasi navigasi, suatu fitur memungkinkan pengguna mendapatkan petunjuk arah belokan demi belokan.
- Dalam aplikasi pesan, suatu fitur memungkinkan pengguna berbagi lokasinya saat ini dengan pengguna lain.
Sistem menganggap aplikasi Anda menggunakan lokasi latar depan jika fitur aplikasi Anda mengakses lokasi perangkat saat ini dalam salah satu situasi berikut:
- Aktivitas berasal dari aplikasi Anda terlihat.
Aplikasi Anda menjalankan layanan latar depan. Saat layanan latar depan berjalan, sistem akan membuat pengguna menyadarinya dengan menampilkan notifikasi persisten. Aplikasi Anda terus memiliki akses jika ditempatkan di latar belakang, seperti saat pengguna menekan tombol Beranda di perangkat atau menonaktifkan layar perangkatnya.
Selain itu, sebaiknya Anda mendeklarasikan jenis layanan latar depan
location
, seperti yang ditunjukkan dalam cuplikan kode berikut. Di Android 10 (API level 29) dan yang lebih baru, Anda harus mendeklarasikan jenis layanan latar depan ini.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
Anda mendeklarasikan kebutuhan untuk lokasi latar depan saat aplikasi meminta izin
ACCESS_COARSE_LOCATION
atau izin
ACCESS_FINE_LOCATION
,
seperti yang ditunjukkan dalam cuplikan berikut:
<manifest ... > <!-- Always include this permission --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Include only if your app benefits from precise location access. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>
Lokasi latar belakang
Aplikasi memerlukan akses lokasi latar belakang jika suatu fitur dalam aplikasi terus-menerus berbagi lokasi dengan pengguna lain atau menggunakan Geofencing API. Beberapa contohnya meliputi:
- Dalam aplikasi berbagi lokasi keluarga, suatu fitur memungkinkan pengguna untuk terus berbagi lokasi dengan anggota keluarga.
- Dalam aplikasi IoT, suatu fitur memungkinkan pengguna untuk mengonfigurasi perangkat rumah mereka, sehingga perangkat akan nonaktif ketika pengguna meninggalkan rumah dan aktif kembali ketika pengguna kembali ke rumah.
Sistem menganggap aplikasi Anda menggunakan lokasi latar belakang jika mengakses lokasi perangkat saat ini dalam situasi apa pun selain yang dijelaskan di bagian lokasi latar depan. Presisi lokasi latar belakang sama dengan presisi lokasi latar depan, yang bergantung pada izin akses lokasi yang dideklarasikan aplikasi Anda.
Di Android 10 (API level 29) dan yang lebih tinggi, Anda harus mendeklarasikan izin
ACCESS_BACKGROUND_LOCATION
dalam manifes aplikasi untuk meminta akses lokasi
latar belakang pada runtime. Pada versi Android
yang lebih lama, jika aplikasi Anda menerima akses lokasi latar depan, aplikasi juga otomatis
menerima akses lokasi latar belakang.
<manifest ... > <!-- Required only when requesting background location access on Android 10 (API level 29) and higher. --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>
Akurasi
Android mendukung level akurasi lokasi berikut:
- Perkiraan
- Memberikan estimasi lokasi perangkat. Jika estimasi lokasi ini berasal dari
LocationManagerService
atauFusedLocationProvider
, estimasi ini akurat dalam jarak sekitar 3 kilometer persegi (sekitar 1,2 mil persegi). Aplikasi Anda dapat menerima lokasi pada tingkat akurasi ini saat Anda mendeklarasikan izinACCESS_COARSE_LOCATION
, tetapi bukan izinACCESS_FINE_LOCATION
. - Akurat
- Memberikan estimasi lokasi perangkat seakurat mungkin. Jika
estimasi lokasi berasal dari
LocationManagerService
atauFusedLocationProvider
, estimasi ini biasanya berada dalam jarak sekitar 50 meter (160 kaki) dan terkadang akurat seperti dalam beberapa meter (10 kaki) atau yang lebih baik. Aplikasi Anda dapat menerima lokasi pada tingkat akurasi ini saat Anda mendeklarasikan izinACCESS_FINE_LOCATION
.
Jika pengguna memberikan izin akses perkiraan lokasi, aplikasi Anda hanya memiliki akses ke perkiraan lokasi, terlepas dari izin akses lokasi yang dideklarasikan aplikasi Anda.
Aplikasi Anda tetap harus berfungsi saat pengguna hanya memberikan akses perkiraan
lokasi. Jika fitur di aplikasi Anda benar-benar memerlukan akses ke lokasi akurat
menggunakan izin ACCESS_FINE_LOCATION
, Anda dapat meminta pengguna untuk mengizinkan
aplikasi Anda untuk mengakses lokasi akurat.
Meminta akses lokasi pada runtime
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, bahkan 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 baru, 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 akurasi 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
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. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Java
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean 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, jika pengguna menjelajahi fungsi yang memerlukan akses lokasi latar belakang, Anda dapat meminta akses lokasi latar belakang.
Meminta lokasi latar belakang jika diperlukan
Konten dialog izin bergantung pada versi SDK target
Saat fitur di aplikasi Anda meminta lokasi latar belakang pada perangkat yang menjalankan Android 10 (API level 29), dialog izin sistem akan menyertakan opsi bernama Izinkan sepanjang waktu. Jika pengguna memilih opsi ini, fitur di aplikasi Anda akan mendapatkan akses lokasi latar belakang.
Di Android 11 (API level 30) dan yang lebih tinggi, dialog sistem tidak menyertakan opsi Izinkan sepanjang waktu. Sebaliknya, pengguna harus mengaktifkan lokasi latar belakang pada halaman setelan, seperti yang ditunjukkan pada gambar 7.
Anda dapat membantu pengguna membuka halaman setelan ini dengan mengikuti praktik terbaik saat meminta izin lokasi latar belakang. Proses pemberian izin bergantung pada versi SDK target aplikasi.
Aplikasi menargetkan Android 11 atau yang lebih baru
Jika aplikasi Anda belum diberi izin ACCESS_BACKGROUND_LOCATION
, dan
shouldShowRequestPermissionRationale()
menampilkan true
, tampilkan UI edukasi kepada pengguna yang menyertakan informasi berikut:
- Penjelasan lengkap tentang alasan fitur aplikasi memerlukan akses ke lokasi latar belakang.
- Label opsi setelan yang dapat dibaca pengguna dan memberikan lokasi latar belakang
(misalnya, label Izinkan sepanjang waktu dalam gambar 7). Anda dapat memanggil
getBackgroundPermissionOptionLabel()
untuk mendapatkan label ini. Nilai hasil dari metode ini dilokalkan ke preferensi bahasa perangkat pengguna. - Opsi bagi pengguna untuk menolak izin. Jika pengguna menolak akses lokasi latar belakang, mereka tetap harus dapat menggunakan aplikasi.
Aplikasi yang menargetkan Android 10 atau yang lebih rendah
Saat fitur di aplikasi meminta akses lokasi latar belakang, pengguna akan melihat dialog sistem. Dialog ini menyertakan opsi untuk membuka opsi izin lokasi aplikasi di halaman setelan.
Selama aplikasi Anda sudah mengikuti praktik terbaik untuk meminta izin akses lokasi, Anda tidak perlu membuat perubahan untuk mendukung perilaku ini.
Pengguna dapat memengaruhi akurasi lokasi latar belakang
Jika pengguna meminta perkiraan lokasi, pilihan
pengguna dalam dialog izin akses lokasi juga berlaku untuk lokasi latar belakang. Dengan
kata lain, jika pengguna memberi aplikasi izin ACCESS_BACKGROUND_LOCATION
tetapi memberikan akses perkiraan lokasi di latar depan saja,
aplikasi juga mendapatkan akses perkiraan lokasi di latar belakang saja.
Pengingat pemberian lokasi latar belakang
Di Android 10 dan yang lebih tinggi, saat fitur dalam aplikasi Anda mengakses lokasi perangkat di latar belakang untuk pertama kalinya setelah pengguna memberikan akses lokasi latar belakang, sistem akan menjadwalkan notifikasi untuk dikirimkan kepada pengguna. Notifikasi ini mengingatkan pengguna bahwa mereka telah mengizinkan aplikasi untuk mengakses lokasi perangkat sepanjang waktu. Contoh notifikasi muncul pada gambar 8.
Memeriksa persyaratan lokasi di dependensi SDK aplikasi
Periksa apakah aplikasi Anda menggunakan SDK yang bergantung pada izin akses lokasi,
terutama izin ACCESS_FINE_LOCATION
. Baca artikel ini di Medium
tentang Mengenal perilaku dependensi
SDK.
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.