Perkiraan lokasi

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

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.

7acc5e2fe09d67ca.jpeg a5e9363364fcc9f9.jpeg

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

2624d89993700ea5.jpeg

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

a2dfb923b8f3548d.jpeg

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.

9d20729f14673547.jpeg

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.

a9553249c3e2b90c.jpeg

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: