Perkiraan lokasi

Dialog hanya mengacu pada perkiraan lokasi dan
         berisi 3 tombol bersusun
Gambar 1. Dialog izin sistem yang muncul saat aplikasi meminta ACCESS_COARSE_LOCATION saja.

Android 12 dibuat berdasarkan perubahan platform terbaru pada model izin lokasi, termasuk lokasi latar belakang dan izin satu kali. Jika aplikasi menarget Android 12, pengguna dapat meminta agar aplikasi hanya mengambil informasi perkiraan lokasi, meskipun jika aplikasi meminta izin runtime ACCESS_FINE_LOCATION.

Jika aplikasi meminta ACCESS_COARSE_LOCATION tetapi tidak meminta ACCESS_FINE_LOCATION, perubahan yang dijelaskan di halaman ini tidak akan berpengaruh. Gambar 1 menunjukkan dialog yang muncul untuk pengguna saat aplikasi menarget Android 12 dan meminta ACCESS_COARSE_LOCATION saja.

Untuk lebih menghormati privasi pengguna, sebaiknya Anda hanya meminta ACCESS_COARSE_LOCATION. Anda dapat memenuhi sebagian besar kasus penggunaan meskipun jika hanya memiliki akses ke informasi perkiraan lokasi.

Jika aplikasi menarget Android 12 dan Anda meminta izin ACCESS_FINE_LOCATION, Anda juga harus meminta izin ACCESS_COARSE_LOCATION. Anda harus menyertakan kedua izin tersebut dalam satu permintaan runtime. Jika Anda mencoba meminta ACCESS_FINE_LOCATION saja, sistem akan mengabaikan permintaan tersebut dan mencatat pesan error berikut di Logcat: ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

Pilihan pengguna antara perkiraan lokasi dan lokasi akurat

Dialog ini memiliki 2 set opsi bersusun
Gambar 2. Dialog izin sistem yang muncul saat aplikasi menarget Android 12 dan meminta ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION dalam satu permintaan runtime.

Saat aplikasi Anda meminta ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION, dialog izin sistem menyertakan opsi baru berikut untuk pengguna:

  • Akurat: Memberikan akurasi lokasi yang diberikan oleh izin ACCESS_FINE_LOCATION.
  • Perkiraan: Memberikan akurasi lokasi yang diberikan oleh izin ACCESS_COARSE_LOCATION.

Gambar 2 menunjukkan bahwa dialog berisi gestur visual untuk kedua opsi baru, guna membantu pengguna memilih. Setelah memutuskan keakuratan lokasi, pengguna akan mengetuk salah satu dari tiga tombol untuk memilih durasi pemberian izin. Tombol-tombol ini sama dengan tombol yang muncul di dialog izin lokasi pada perangkat yang menjalankan Android 11 (API level 30).

Pada Android 12, pengguna dapat membuka setelan sistem untuk menyetel akurasi lokasi pilihan untuk aplikasi apa pun, terlepas dari versi SDK target aplikasi tersebut. Hal ini berlaku meskipun jika aplikasi Anda diinstal di perangkat yang menjalankan Android 11 atau yang lebih lama, lalu di-upgrade ke Android 12. Jika pengguna men-downgrade akses lokasi aplikasi dari akurat ke perkiraan, baik dari dialog izin maupun di setelan sistem, sistem akan memulai ulang proses aplikasi. Karena alasan ini, Anda harus mengikuti praktik terbaik untuk meminta izin 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
});

Pilihan pengguna juga memengaruhi lokasi latar belakang

Jika sistem memberikan izin ACCESS_BACKGROUND_LOCATION ke aplikasi Anda, pilihan pengguna dalam dialog izin lokasi juga berlaku untuk lokasi latar belakang.

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

Meng-upgrade ke lokasi akurat

Perkiraan lokasi dapat memengaruhi aplikasi jika saat ini aplikasi mengandalkan akses lokasi akurat menggunakan izin ACCESS_FINE_LOCATION.

Sebelum meminta pengguna untuk meng-upgrade 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 yang baru, 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 kepada aplikasi, dialog sistem kali ini berbeda, seperti yang ditunjukkan pada gambar 3 dan gambar 4:
Dialog berisi opsi 'Ubah ke lokasi akurat', 'Hanya kali ini', dan 'Tolak'.
Gambar 3. Pengguna sebelumnya telah memilih Perkiraan dan Saat aplikasinya digunakan (dalam dialog dari gambar 2).
Dialog berisi opsi 'Hanya kali ini' dan 'Tolak'.
Gambar 4. Pengguna sebelumnya telah memilih Perkiraan dan Hanya kali ini (dalam dialog dari gambar 2).

Menguji cara aplikasi menangani perkiraan lokasi

Untuk mengevaluasi apakah Anda perlu meng-update aplikasi guna mendukung akurasi lokasi yang dapat dikonfigurasi pengguna, selesaikan pengujian yang dijelaskan di bagian ini.

Menangani permintaan perkiraan lokasi dari dialog

Untuk mengetahui cara aplikasi menangani permintaan pengguna agar aplikasi mendapatkan akses perkiraan lokasi dari dialog baru, lakukan hal berikut:

  1. Minta ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION.
  2. Pada dialog yang muncul (gambar 2), pilih Perkiraan di dekat bagian atas, dan Saat aplikasinya digunakan atau Hanya kali ini di dekat bagian bawah.
  3. Pastikan kasus penggunaan aplikasi masih berfungsi sesuai harapan, meskipun jika aplikasi hanya memiliki akses perkiraan lokasi.

Menangani downgrade perkiraan lokasi dari setelan sistem

Gambar 5. Layar izin akses lokasi aplikasi di setelan sistem sekarang menyertakan Gunakan lokasi akurat. Opsi ini terpisah dari setelan akses lokasi yang muncul di dekat bagian atas layar.

Untuk mengetahui cara aplikasi menangani permintaan pengguna agar akses lokasi aplikasi diubah dari akurat ke perkiraan di setelan sistem, lakukan hal berikut:

  1. Minta ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION.
  2. Pada dialog yang muncul (gambar 2), pilih Akurat di dekat bagian atas, dan Saat aplikasinya digunakan atau Hanya kali ini di dekat bagian bawah.
  3. Buka layar izin aplikasi di setelan sistem.
  4. Pada layar izin lokasi, nonaktifkan Gunakan lokasi akurat. Opsi ini dapat dilihat pada gambar 5.

    Seperti halnya downgrade izin, sistem akan memulai ulang proses aplikasi Anda.

  5. Pastikan kasus penggunaan aplikasi masih berfungsi sesuai harapan, meskipun jika aplikasi hanya memiliki akses perkiraan lokasi.

Menangani upgrade lokasi akurat dari setelan sistem

Untuk mengetahui cara aplikasi menangani permintaan pengguna agar akses lokasi aplikasi diubah dari perkiraan ke akurat di setelan sistem, lakukan hal berikut:

  1. Minta ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION.
  2. Pada dialog yang muncul (gambar 2), pilih Perkiraan di dekat bagian atas, dan Saat aplikasinya digunakan atau Hanya kali ini di dekat bagian bawah.
  3. Buka layar izin aplikasi di setelan sistem.
  4. Pada layar izin lokasi, aktifkan Gunakan lokasi akurat, seperti yang ditunjukkan pada gambar 5.

    Sistem tidak akan memulai ulang aplikasi karena perubahan izin ini adalah upgrade.

  5. Periksa apakah aplikasi menerima data lokasi yang lebih akurat dalam kasus penggunaan berbasis lokasinya atau tidak.

Memeriksa persyaratan lokasi di dependensi SDK aplikasi

Periksa apakah aplikasi Anda menggunakan SDK yang mengandalkan izin ACCESS_FINE_LOCATION. Baca artikel ini di Medium tentang Mengenal perilaku dependensi SDK.