Meminta akses lokasi saat 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, 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.

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

@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:

  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, 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