Skip to content

Most visited

Recently visited

navigation

Meminta Izin Pada Waktu Proses

Bagian pelajaran ini mengajarkan Anda cara

Dependensi dan Prasyarat

  • Android 6.0 (API level 23)

Anda juga harus membaca

Dimulai dari Android 6.0 (API level 23), pengguna memberikan izin ke aplikasi saat aplikasi sedang berjalan, bukan ketika mereka memasang aplikasi. Pendekatan ini menyederhanakan proses pemasangan aplikasi, karena pengguna tidak perlu memberikan izin ketika mereka memasang atau memperbarui aplikasi. Ini juga memberikan kontrol yang lebih besar untuk pengguna atas fungsionalitas aplikasi; misalnya, pengguna bisa memilih untuk memberikan akses aplikasi kamera ke perangkat kamera namun tidak ke lokasi perangkat. Pengguna bisa membatalkan izin setiap saat, dengan masuk ke layar Settings aplikasi.

Izin sistem dibagi menjadi dua kategori, biasa dan berbahaya:

Untuk informasi selengkapnya, lihat Izin Biasa dan Berbahaya.

Pada semua versi Android, aplikasi Anda harus mendeklarasikan izin biasa dan berbahaya yang dibutuhkan dalam manifes aplikasi, seperti yang dijelaskan dalam Mendeklarasikan Izin. Akan tetapi, efek dari deklarasi akan berbeda bergantung pada versi sistem dan level SDK aplikasi target:

Catatan: Mulai Android 6.0 (API level 23), pengguna dapat mencabut izin aplikasi setiap saat, bahkan jika aplikasi menargetkan API level yang lebih rendah. Anda harus menguji aplikasi untuk memverifikasi bahwa aplikasi berperilaku dengan benar ketika kehilangan izin yang diperlukan, terlepas dari API level target aplikasi.

Bagian pelajaran ini menjelaskan cara menggunakan Pustaka Dukungan Android untuk memeriksa dan meminta izin. Kerangka kerja Android menyediakan metode yang sama seperti Android 6.0 (API level 23). Akan tetapi, menggunakan pustaka dukungan lebih sederhana, karena aplikasi Anda tidak perlu memeriksa versi Android yang digunakan sebelum memanggil metode.

Memeriksa Izin

Jika aplikasi membutuhkan izin berbahaya, Anda harus memeriksa apakah Anda memiliki izin tersebut setiap kali melakukan operasi yang membutuhkan izin. Pengguna bebas untuk mencabut izin, sehingga meskipun kemarin aplikasi dapat menggunakan kamera, jangan beranggapan bahwa aplikasi pasti masih memiliki izin tersebut hari ini.

Untuk memeriksa apakah Anda memiliki izin, panggil metode ContextCompat.checkSelfPermission(). Misalnya, cuplikan berikut menunjukkan cara memeriksa apakah suatu aktivitas memiliki izin untuk menulis ke kalender:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

Jika aplikasi memiliki izin, metode akan mengembalikan PackageManager.PERMISSION_GRANTED, dan aplikasi dapat melanjutkan operasi. Jika aplikasi tidak memiliki izin, metode mengembalikan PERMISSION_DENIED, dan aplikasi harus secara eksplisit meminta izin ke pengguna.

Meminta Izin

Jika aplikasi Anda membutuhkan izin berbahaya yang terdaftar dalam manifes aplikasi, aplikasi harus meminta pengguna agar memberikan izin. Android menyediakan sejumlah metode yang bisa digunakan untuk meminta izin. Memanggil metode ini menampilkan dialog Android standar, yang tidak dapat Anda sesuaikan.

Jelaskan mengapa aplikasi membutuhkan izin

Gambar 1. Dialog sistem menanyakan pengguna untuk memberikan atau menolak izin.

Dalam keadaan tertentu, mungkin Anda ingin membantu pengguna untuk memahami mengapa aplikasi membutuhkan izin. Misalnya, jika pengguna meluncurkan aplikasi fotografi, pengguna mungkin tidak akan terkejut saat aplikasi meminta izin untuk menggunakan kamera, namun pengguna mungkin tidak memahami mengapa aplikasi juga menginginkan akses ke lokasi atau kontak pengguna. Sebelum meminta izin, Anda harus memikirkan untuk memberikan penjelasan kepada pengguna. Harus diingat bahwa Anda tidak ingin membingungkan pengguna dengan penjelasan; jika Anda memberikan terlalu banyak penjelasan, pengguna mungkin merasa aplikasi tidak bagus dan menghapusnya.

Salah satu pendekatan yang bisa Anda gunakan adalah untuk memberikan penjelasan hanya jika pengguna menolak permintaan izin tersebut. Jika pengguna terus mencoba menggunakan fungsionalitas yang memerlukan izin, namun tetap menolak permintaan izin, mungkin pengguna tidak mengerti mengapa aplikasi membutuhkan izin untuk menyediakan fungsionalitas itu. Dalam situasi tersebut, ini adalah waktu yang tepat untuk menampilkan penjelasan.

Untuk membantu menemukan situasi ketika pengguna mungkin memerlukan penjelasan, Android menyediakan metode utilitas, shouldShowRequestPermissionRationale(). Metode ini mengembalikan true jika aplikasi telah meminta izin ini sebelumnya dan pengguna menolak permintaan tersebut.

Catatan: Jika pengguna sebelumnya perna menolak permintaan izin dan memilih opsi Don't ask again dalam dialog sistem permintaan izin, metode akan mengembalikan false. Metode ini juga akan mengembalikanfalse jika kebijakan perangkat melarang aplikasi memiliki izin tersebut.

Meminta izin yang Anda butuhkan

Jika aplikasi Anda belum memiliki izin yang dibutuhkan, aplikasi harus memanggil salah satu metode requestPermissions() untuk meminta izin yang tepat. Aplikasi Anda meneruskan izin yang diperlukan, dan juga kode permintaan integer yang Anda tetapkan untuk mengidentifikasi permintaan izin ini. Metode ini berfungsi secara asinkron: ini mengembalikan dengan segera, dan setelah pengguna merespons kotak dialog, sistem akan memanggil metode callback aplikasi beserta hasilnya, meneruskan kode permintaan serupa yang diteruskan aplikasi ke requestPermissions().

Kode berikut memeriksa apakah aplikasi memiliki izin untuk membaca kontak pengguna, dan meminta izin jika diperlukan:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Catatan: Ketika aplikasi memanggil requestPermissions(), sistem akan menampilkan kotak dialog standar kepada pengguna. Aplikasi Anda tidak dapat mengonfigurasi atau mengubah kotak dialog. Jika Anda perlu memberikan informasi atau penjelasan kepada pengguna, Anda harus melakukannya sebelum memanggil requestPermissions(), seperti yang dijelaskan dalam Jelaskan mengapa aplikasi membutuhkan izin.

Menangani respons permintaan izin

Ketika aplikasi meminta izin, sistem akan menyajikan kotak dialog kepada pengguna. Ketika pengguna merespons, sistem akan memanggil metode onRequestPermissionsResult() aplikasi, memberikannya respons pengguna. Aplikasi Anda harus mengganti metode tersebut untuk mengetahui apakah izin telah diberikan. Callback meneruskan kode permintaan yang sama seperti yang Anda teruskan ke requestPermissions(). Misalnya, jika aplikasi meminta akses READ_CONTACTS, itu mungkin memiliki metode callback berikut:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Kotak dialog yang ditampilkan oleh sistem menjelaskan grup izin yang perlu diakses aplikasi Anda; izin khususnya tidak dicantumkan. Misalnya, jika Anda meminta izin READ_CONTACTS, kotak dialog sistem hanya mengatakan bahwa aplikasi Anda membutuhkan akses ke kontak perangkat. Pengguna hanya perlu memberikan satu kali izin untuk setiap grup izin. Jika aplikasi Anda meminta izin lainnya dalam grup itu (yang terdaftar dalam manifes aplikasi), sistem akan secara otomatis memberikannya. Ketika Anda meminta izin, sistem akan memanggil metode callback onRequestPermissionsResult() dan meneruskan PERMISSION_GRANTED, dengan cara yang sama seperti jika pengguna telah secara eksplisit mengizinkan permintaan Anda melalui kotak dialog sistem.

Catatan: Aplikasi Anda masih harus secara eksplisit meminta setiap izin yang dibutuhkan, bahkan jika pengguna telah memberikan izin lain di grup yang sama. Selain itu, pengelompokan izin ke dalam grup dapat berubah dalam rilis Android mendatang. Kode Anda sebaiknya jangan bergantung pada asumsi bahwa izin tertentu berada dalam grup yang sama atau tidak.

Misalnya, anggap saja Anda mencantumkan READ_CONTACTS dan WRITE_CONTACTS dalam manifes aplikasi Anda. Jika Anda meminta READ_CONTACTS dan pengguna memberikan izin, kemudian Anda meminta WRITE_CONTACTS, sistem akan langsung memberikan izin tanpa berinteraksi dengan pengguna.

Jika pengguna menolak permintaan izin, aplikasi Anda harus melakukan tindakan yang tepat. Misalnya, aplikasi Anda mungkin menampilkan dialog yang menjelaskan mengapa aplikasi tidak bisa melakukan tindakan yang diminta pengguna karena membutuhkan izin tersebut.

Ketika sistem meminta pengguna untuk memberikan izin, pengguna akan memiliki opsi untuk memberi tahu sistem agar tidak meminta izin itu lagi. Dalam kasus ini, setiap kali aplikasi menggunakan requestPermissions() untuk meminta izin itu lagi, sistem langsung menolak permintaan. Sistem memanggil metode callback onRequestPermissionsResult() dan memberikan PERMISSION_DENIED, dengan cara yang sama seperti ketika pengguna secara eksplisit menolak permintaan Anda. Ini berarti bahwa ketika Anda memanggil requestPermissions(), Anda tidak dapat beranggapan bahwa telah terjadi interaksi langsung dengan pengguna.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Ikuti Google Developers di WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)