Meminta izin akses lokasi

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:

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 atau FusedLocationProvider, 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 izin ACCESS_COARSE_LOCATION, tetapi bukan izin ACCESS_FINE_LOCATION.
Akurat
Memberikan estimasi lokasi perangkat seakurat mungkin. Jika estimasi lokasi berasal dari LocationManagerService atau FusedLocationProvider, 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 izin ACCESS_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.

Setelah pengguna memilih tombol Bagikan Lokasi,
    dialog izin akses lokasi sistem akan muncul
Gambar 1. Fitur berbagi lokasi yang memerlukan akses lokasi latar depan. Fitur ini diaktifkan jika pengguna memilih Izinkan hanya saat aplikasi digunakan.

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.

Dialog hanya mengacu pada perkiraan lokasi dan
         berisi 3 tombol bersusun
Gambar 2. Dialog izin sistem yang muncul saat aplikasi meminta ACCESS_COARSE_LOCATION saja.
Dialog ini memiliki 2 set opsi bersusun
Gambar 3. Dialog izin sistem yang muncul saat aplikasi Anda meminta ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION dalam satu permintaan runtime.

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:

  1. Jika perlu, jelaskan alasan aplikasi Anda memerlukan izin.
  2. Minta izin ACCESS_FINE_LOCATION dan ACCESS_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:
Dialog berisi opsi &#39;Ubah ke lokasi akurat&#39;, &#39;Hanya kali ini&#39;, dan &#39;Tolak&#39;.
Gambar 4. Pengguna sebelumnya telah memilih Perkiraan dan Saat aplikasinya digunakan (dalam dialog dari gambar 3).
Dialog berisi opsi &#39;Hanya kali ini&#39; dan &#39;Tolak&#39;.
Gambar 5. Pengguna sebelumnya telah memilih Perkiraan dan Hanya kali ini (dalam dialog dari gambar 3).

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.

Tombol yang mengaktifkan akses lokasi latar depan
    diposisikan setengah layar dari tombol yang mengaktifkan lokasi
    latar belakang
Gambar 6. Kedua fitur tersebut memerlukan akses lokasi, tetapi hanya fitur "rekomendasikan tempat-tempat terdekat" yang memerlukan akses lokasi latar belakang.

Proses untuk melakukan permintaan inkremental adalah sebagai berikut:

  1. 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.

  2. Nantinya, jika pengguna menjelajahi fungsi yang memerlukan akses lokasi latar belakang, Anda dapat meminta akses lokasi latar belakang.

Meminta lokasi latar belakang jika diperlukan

Gambar 7. Halaman setelan yang menyertakan opsi Izinkan sepanjang waktu, yang memberikan akses lokasi latar belakang.

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.
Pengguna dapat mengetuk notifikasi sistem untuk mengubah
  setelan lokasi untuk aplikasi
Gambar 8. Notifikasi mengingatkan pengguna bahwa mereka telah memberikan akses lokasi latar belakang ke suatu 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