1. Pengantar
Di Android 12 (API level 31) dan yang lebih baru, pengguna memiliki opsi untuk mengontrol akurasi lokasi yang ingin mereka berikan untuk aplikasi. Di Android versi sebelumnya, akurasi lokasi dikontrol secara implisit berdasarkan apakah aplikasi meminta izin ACCESS_FINE_LOCATION
atau ACCESS_COARSE_LOCATION
.
Codelab ini akan memberikan panduan dan praktik terbaik untuk aplikasi yang memiliki SDK target versi 31 dan yang lebih baru guna meminta izin akses lokasi.
Prasyarat
- Pengalaman dengan pengembangan Android
- Pengenalan aktivitas dan izin.
- Pengetahuan awal tentang cara meminta izin aplikasi
- Pengetahuan awal tentang cara meminta izin akses lokasi
Yang akan Anda pelajari
- Cara meminta izin akses lokasi di Android S
- Cara menerapkan alur permintaan lokasi yang optimal agar pengguna dapat memberikan izin akses lokasi yang akurat bagi aplikasi Anda
Persyaratan
Lokasi akurat: perincian lokasi untuk izin ACCESS_FINE_LOCATION
.
Perkiraan lokasi: perincian lokasi untuk izin ACCESS_COARSE_LOCATION
.
API yang tercakup
2. Meminta izin ACCESS_FINE_LOCATION
Alur UI baru
Mari kita lihat UI baru untuk mendapatkan beberapa ide perubahan akurasi lokasi.
Gambar 1a dan 1b di bawah menunjukkan dialog izin yang muncul saat aplikasi tidak mendapat izin ACCESS_FINE_LOCATION
atau ACCESS_COARSE_LOCATION
.
Gambar 1a: Lokasi akurat dipilih Gambar 1b: Perkiraan lokasi dipilih
Gambar 2a di bawah menampilkan dialog upgrade izin yang muncul saat aplikasi mendapat izin ACCESS_COARSE_LOCATION
saat digunakan. Dialog ini muncul jika pengguna memilih "Saat menggunakan aplikasi" untuk Perkiraan lokasi dari layar sebelumnya (ditunjukkan pada Gambar 1b).
Gambar 2a
Gambar 2b di bawah menampilkan dialog upgrade izin yang muncul saat aplikasi telah mendapat izin ACCESS_COARSE_LOCATION
hanya untuk sesi saat ini. Dialog ini muncul jika pengguna memilih "Hanya kali ini" dari layar sebelumnya (ditunjukkan pada Gambar 1b).
Gambar 2b
3. Penerapan kode
Mendeklarasikan izin akses lokasi dalam manifes aplikasi
Untuk meminta ACCESS_FINE_LOCATION
, sistem mengharuskan aplikasi mendeklarasikan ACCESS_FINE_LOCATION
dan ACCESS_COARSE_LOCATION
dalam manifes aplikasi. Jika tidak, sistem akan mengabaikan permintaan tersebut dan tidak memberikan izin apa pun untuk aplikasi Anda.
<manifest ... >
<!-- Required when requesting precise location access on Android 12 (API level 31) and higher. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
Meminta izin ACCESS_FINE_LOCATION
MyActivity.kt (Kotlin)
when {
ContextCompat.checkSelfPermission(
CONTEXT,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED -> {
// You can use the API that requires the permission.
performAction(...)
}
shouldShowRequestPermissionRationale(...) -> {
// In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
showInContextUI(...)
}
else -> {
// Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
requestPermissions(CONTEXT,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION),
REQUEST_CODE)
}
}
MyActivity.java (Java)
if (ContextCompat.checkSelfPermission(
CONTEXT, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
// You can use the API that requires the permission.
performAction(...);
} else if (shouldShowRequestPermissionRationale(...)) {
// In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
showInContextUI(...);
} else {
// Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
requestPermissions(CONTEXT,
new String[] { Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION },
REQUEST_CODE);
}
Menangani respons
MyActivity.kt (Kotlin)
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
REQUEST_CODE -> {
// If the request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty()) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_FINE_LOCATION is granted
} else if (grantResults[1] ==
PackageManager.PERMISSION_GRANTED) {
// ACCESS_COARSE_LOCATION is granted
}
} else {
// Explain to the user that the feature is unavailable because
// the feature requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
}
return
}
// Add other 'when' lines to check for other
// permissions this app might request.
else -> {
// Ignore all other requests.
}
}
}
MyActivity.java (Java)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
// If the request is cancelled, the result arrays are empty.
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_FINE_LOCATION is granted
} else if (grantResults[1] ==
PackageManager.PERMISSION_GRANTED) {
// ACCESS_COARSE_LOCATION is granted
}
} else {
// Explain to the user that the feature is unavailable because
// the feature requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
}
return;
}
// Other 'case' lines to check for other
// permissions this app might request.
}
}
4. Meminta izin ACCESS_COARSE_LOCATION saja
Gambar 4 menunjukkan dialog izin yang muncul saat aplikasi hanya meminta izin ACCESS_COARSE_LOCATION
.
Gambar 4
Agar berfungsi hanya dengan izin akses perkiraan lokasi, aplikasi Anda hanya perlu mendeklarasikan dan menangani izin perkiraan di setiap langkah.
5. Setelan Lokasi
Gambar 5 di bawah menunjukkan setelan izin akses lokasi baru. Tombol beralih baru tersedia bagi pengguna untuk mengontrol apakah aplikasi dapat mengakses lokasi akurat atau perkiraan lokasi.
Gambar 5
6. Untuk aplikasi yang menargetkan SDK versi 30 dan yang lebih lama
Opsi presisi lokasi yang baru (akurat/perkiraaan) tidak terlihat oleh aplikasi yang memiliki SDK target versi 30 dan yang lebih lama.
7. Selamat!
Anda telah mempelajari cara meminta izin akses lokasi di Android 12 dan berhasil mempelajari banyak komponen utama dari izin akses lokasi.
Anda kini dapat meminta izin akses lokasi untuk berbagai kasus penggunaan guna memenuhi kebutuhan aplikasi Anda.
Pelajari lokasi lebih lanjut: