Minta Izin Aplikasi

Setiap aplikasi Android berjalan dalam sandbox dengan akses terbatas. Jika harus menggunakan resource atau informasi di luar sandbox miliknya, aplikasi harus meminta izin yang sesuai. Untuk mendeklarasikan bahwa aplikasi Anda memerlukan izin, cantumkan izin dalam manifes aplikasi lalu minta pengguna untuk menyetujui setiap izin pada waktu proses (di Android 6.0 dan yang lebih tinggi).

Prinsip dasarnya adalah sebagai berikut:

  • Minta izin dalam konteks, saat pengguna mulai berinteraksi dengan fitur yang memerlukan izin.
  • Jangan blokir pengguna. Selalu berikan opsi untuk membatalkan alur UI edukatif yang terkait dengan izin.
  • Jika pengguna menolak atau mencabut izin yang diperlukan suatu fitur, turunkan versi aplikasi Anda dengan baik sehingga pengguna dapat terus menggunakan aplikasi Anda, mungkin bisa dilakukan dengan menonaktifkan fitur yang memerlukan izin tersebut.
  • Jangan asumsikan perilaku sistem apa pun.

Halaman ini akan memandu Anda melalui proses langkah demi langkah untuk menambahkan izin ke aplikasi dan meminta izin tersebut pada waktu proses sesuai yang diperlukan.

Menambahkan izin ke manifes

Pada semua versi Android, untuk mendeklarasikan bahwa aplikasi Anda memerlukan izin, masukkan elemen <uses-permission> dalam manifes aplikasi Anda, sebagai turunan dari elemen <manifest> level teratas.

Misalnya, aplikasi yang perlu mengakses internet akan memiliki baris berikut dalam manifes:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- other permissions go here -->

    <application ...>
        ...
    </application>
</manifest>

Perilaku sistem setelah Anda mendeklarasikan izin bergantung pada seberapa sensitif izin tersebut. Beberapa izin dianggap "normal" sehingga sistem segera memberikannya setelah aplikasi diinstal. Izin lainnya dianggap "berbahaya" sehingga pengguna harus memberikan izin akses aplikasi secara eksplisit. Untuk mengetahui informasi selengkapnya tentang berbagai jenis izin, lihat Tingkat perlindungan.

Memeriksa izin

Jika aplikasi membutuhkan izin berbahaya, Anda harus memeriksa apakah Anda memiliki izin tersebut setiap kali melakukan operasi yang membutuhkannya. Pada Android 6.0 (API level 23) dan yang lebih tinggi, pengguna dapat mencabut izin berbahaya dari aplikasi apa pun kapan saja.

Menentukan apakah aplikasi Anda sudah diberi izin

Untuk memastikan apakah pengguna sudah memberikan izin tertentu ke aplikasi Anda, teruskan izin tersebut ke metode ContextCompat.checkSelfPermission(). Metode ini menampilkan PERMISSION_GRANTED atau PERMISSION_DENIED, tergantung apakah aplikasi Anda memiliki izin atau tidak.

Menjelaskan alasan aplikasi memerlukan izin

Jika metode ContextCompat.checkSelfPermission() menampilkan PERMISSION_DENIED, panggil shouldShowRequestPermissionRationale() untuk memeriksa apakah aplikasi Anda harus menampilkan UI edukatif kepada pengguna. Pada UI ini, jelaskan alasan fitur yang ingin diaktifkan pengguna memerlukan izin tertentu.

Meminta izin

Setelah pengguna melihat UI edukatif dan mendapatkan insight tentang alasan aplikasi memerlukan izin tertentu, atau setelah shouldShowRequestPermissionRationale() menampilkan false, Anda dapat menampilkan dialog sistem izin dengan memanggil requestPermissions(). Saat memanggil requestPermissions(), Anda harus meneruskan kode permintaan integer, yang Anda gunakan lagi saat menangani respons permintaan izin.

Catatan: Aplikasi Anda tidak dapat menyesuaikan dialog yang muncul saat Anda memanggil requestPermissions(). Untuk memberikan lebih banyak informasi atau konteks kepada pengguna, ubah UI aplikasi Anda agar lebih mudah bagi pengguna untuk memahami alasan fitur dalam aplikasi Anda memerlukan izin tertentu. Misalnya, Anda dapat mengubah teks di tombol yang mengaktifkan fitur tersebut.

Selain itu, teks dalam dialog izin sistem merujuk ke grup izin yang terkait dengan izin yang Anda minta. Pengelompokan izin ini dirancang untuk kemudahan penggunaan sistem, dan aplikasi Anda tidak boleh mengandalkan izin yang ada di dalam atau di luar grup izin tertentu.

Cuplikan kode berikut menunjukkan rekomendasi proses untuk memeriksa izin, dan meminta izin dari pengguna jika diperlukan:

Kotlin

when {
    ContextCompat.checkSelfPermission(
            CONTEXT,
            Manifest.permission.REQUESTED_PERMISSION
            ) == 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 -> {
        // You can directly ask for the permission.
        requestPermissions(...)
    }
}

Java

if (ContextCompat.checkSelfPermission(
        CONTEXT, Manifest.permission.REQUESTED_PERMISSION) ==
        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 {
    // You can directly ask for the permission.
    requestPermissions(...);
}

Menangani respons permintaan izin

Saat pengguna merespons permintaan izin aplikasi Anda, sistem akan memanggil implementasi onRequestPermissionsResult() aplikasi Anda. Sistem meneruskan respons pengguna ke dialog izin serta kode permintaan yang Anda tentukan, seperti yang ditunjukkan dalam cuplikan kode berikut:

Kotlin

override fun onRequestPermissionsResult(requestCode: Int,
        permissions: Array<String>, grantResults: IntArray) {
    when (requestCode) {
        PERMISSION_REQUEST_CODE -> {
            // If request is cancelled, the result arrays are empty.
            if ((grantResults.isNotEmpty() &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                // Permission is granted. Continue the action or workflow
                // in your app.
            } else {
                // Explain to the user that the feature is unavailable because
                // the features 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.
        }
    }
}

Java

@Override
public void onRequestPermissionsResults(int requestCode, String[] permissions,
        int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission is granted. Continue the action or workflow
                // in your app.
            }  else {
                // Explain to the user that the feature is unavailable because
                // the features 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.
    }
}

Menangani penolakan izin

Jika pengguna menolak permintaan izin, aplikasi Anda harus membantu pengguna memahami implikasi atas penolakan izin tersebut. Secara khusus, aplikasi Anda harus membuat pengguna mengetahui fitur yang tidak berfungsi karena tidak adanya izin. Saat Anda melakukannya, perhatikan praktik terbaik berikut:

  • Arahkan perhatian pengguna. Perjelas bagian tertentu UI aplikasi Anda yang memiliki fungsi terbatas karena aplikasi Anda tidak memiliki izin yang diperlukan. Beberapa contoh yang dapat Anda lakukan meliputi hal-hal berikut:

    • Menampilkan pesan di tempat hasil atau data fitur akan muncul.
    • Menampilkan tombol lain yang berisi ikon dan warna error.
  • Harus spesifik. Jangan menampilkan pesan umum. Sebagai gantinya, sebutkan fitur mana yang tidak tersedia karena aplikasi Anda tidak memiliki izin yang diperlukan.

  • Jangan tutupi antarmuka pengguna. Dengan kata lain, jangan tampilkan pesan peringatan layar penuh yang mencegah pengguna terus menggunakan aplikasi Anda.

Dalam situasi tertentu, izin mungkin ditolak secara otomatis, tanpa pengguna melakukan tindakan apa pun. (Demikian pula, suatu izin mungkin diberikan secara otomatis juga.) Penting untuk tidak mengasumsikan apa pun tentang perilaku otomatis. Setiap kali aplikasi Anda perlu mengakses fungsionalitas yang memerlukan izin, pastikan aplikasi Anda masih diberi izin tersebut.

Untuk memberikan pengalaman pengguna terbaik saat meminta izin aplikasi, lihat juga Praktik Terbaik Izin Aplikasi.

Meminta untuk menjadi pengendali default, jika diperlukan

Beberapa aplikasi bergantung pada akses ke informasi pengguna sensitif yang terkait dengan log panggilan dan pesan SMS. Jika ingin meminta izin khusus untuk log panggilan dan pesan SMS serta memublikasikan aplikasi ke Play Store, Anda harus meminta pengguna menetapkan aplikasi Anda sebagai pengendali default untuk fungsi sistem inti sebelum meminta izin waktu proses ini.

Untuk informasi selengkapnya tentang pengendali default, termasuk cara menampilkan permintaan pengendali default kepada pengguna, lihat panduan tentang izin yang hanya digunakan dalam pengendali default.

Mendeklarasikan izin berdasarkan API level

Untuk mendeklarasikan izin hanya pada perangkat yang mendukung izin waktu proses, yaitu perangkat yang menjalankan Android 6.0 (API level 23) atau yang lebih tinggi, sertakan tag uses-permission-sdk-23, bukan tag uses-permission.

Saat menggunakan salah satu tag ini, Anda dapat menyetel atribut maxSdkVersion untuk menetapkan bahwa, pada perangkat yang menjalankan versi lebih tinggi, izin tertentu tidak diperlukan.

Referensi lainnya

Untuk informasi tambahan tentang izin, baca artikel berikut:

Untuk mempelajari lebih lanjut cara meminta izin, download sampel aplikasi berikut:

  • Sampel Android RuntimePermissionsBasic Java | Kotlin