Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Ringkasan izin

Tujuan izin adalah untuk melindungi privasi pengguna Android. Aplikasi Android harus meminta izin untuk mengakses data pengguna yang sensitif (seperti kontak dan SMS), serta fitur sistem tertentu (seperti kamera dan internet). Bergantung pada fitur, sistem mungkin memberikan izin secara otomatis atau mungkin meminta pengguna untuk menyetujui permintaan.

Poin penting dari arsitektur keamanan Android adalah bahwa tidak ada aplikasi yang secara default memiliki izin untuk melakukan operasi apa pun yang akan berdampak buruk pada aplikasi lain, sistem operasi, atau pengguna. Hal ini termasuk membaca atau menulis data pribadi pengguna (seperti kontak atau email), membaca atau menulis file aplikasi lain, melakukan akses jaringan, menjaga perangkat tetap aktif, dan sebagainya.

Halaman ini memberikan ringkasan mengenai cara kerja izin Android, termasuk: bagaimana izin diberikan kepada pengguna, perbedaan antara permintaan izin waktu penginstalan dan waktu proses, bagaimana izin diberlakukan, dan jenis izin serta kelompoknya. Jika Anda hanya menginginkan panduan cara kerja untuk menggunakan izin aplikasi, lihat Meminta Izin Aplikasi.

Persetujuan izin

Aplikasi harus memublikasikan izin yang diperlukan dengan menyertakan tag <uses-permission> dalam manifes aplikasi. Misalnya, sebuah aplikasi yang perlu mengirimkan pesan SMS akan memiliki baris ini dalam manifesnya:

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

    <uses-permission android:name="android.permission.SEND_SMS"/>

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

Jika aplikasi Anda menampilkan izin normal dalam manifesnya (yaitu, izin yang tidak menimbulkan banyak risiko bagi privasi pengguna atau pengoperasian perangkat), sistem akan otomatis memberikan izin tersebut ke aplikasi Anda.

Jika aplikasi Anda mencantumkan izin berbahaya dalam manifesnya (yaitu, izin yang berpotensi memengaruhi privasi pengguna atau operasi normal perangkat), seperti izin SEND_SMS di atas, pengguna harus secara eksplisit setuju untuk memberikan izin tersebut.

Untuk informasi selengkapnya tentang izin normal dan berbahaya, lihat Tingkat perlindungan.

Permintaan yang memerlukan izin berbahaya

Hanya izin berbahaya yang memerlukan persetujuan pengguna. Cara Android meminta pengguna untuk memberikan izin berbahaya bergantung pada versi Android yang berjalan di perangkat pengguna, dan versi sistem yang ditargetkan oleh aplikasi Anda.

Permintaan waktu proses (Android 6.0 dan yang lebih tinggi)

Jika perangkat menjalankan Android 6.0 (API level 23) atau lebih tinggi, dan targetSdkVersion aplikasi adalah 23 atau lebih tinggi, pengguna tidak mendapatkan pemberitahuan tentang izin aplikasi apa pun pada waktu penginstalan. Aplikasi Anda harus meminta pengguna untuk memberikan izin berbahaya saat waktu proses. Saat aplikasi Anda meminta izin, pengguna akan melihat dialog sistem (seperti yang ditampilkan dalam gambar 1, kiri) memberi tahu pengguna grup izin mana yang coba diakses oleh aplikasi Anda. Dialog meliputi tombol Tolak dan Izinkan.

Jika pengguna menolak permintaan izin, pada saat berikutnya aplikasi Anda meminta izin, dialog berisi kotak centang yang, saat dicentang, menunjukkan pengguna tidak ingin dimintai izin lagi (lihat gambar 1, kanan).

Gambar 1. Dialog izin awal (kiri) dan permintaan izin kedua dengan opsi untuk tidak lagi menampilkan permintaan lebih lanjut (kanan)

Jika pengguna mencentang kotak Jangan tanya lagi dan mengetuk Tolak, sistem tidak akan lagi meminta pengguna jika aplikasi Anda kemudian berupaya meminta izin yang sama.

Bahkan jika pengguna memberikan aplikasi Anda izin yang diminta, Anda tidak dapat selalu mengandalkan izin tersebut. Pengguna juga memiliki opsi untuk mengaktifkan dan menonaktifkan izin satu-per-satu dalam setelan sistem. Anda harus selalu memeriksa dan meminta izin pada waktu proses untuk mencegah error waktu proses (SecurityException).

Untuk detail tentang cara menangani permintaan izin waktu proses, lihat Meminta Izin Aplikasi.

Permintaan waktu penginstalan (Android 5.1.1 dan yang lebih rendah)

Jika perangkat menjalankan Android 5.1.1 (API level 22) atau lebih rendah, atau targetSdkVersion aplikasi adalah 22 atau lebih rendah saat berjalan di versi Android apa pun, sistem akan otomatis meminta pengguna memberikan semua izin berbahaya untuk aplikasi Anda pada waktu penginstalan (lihat gambar 2).

Gambar 2. Dialog izin waktu penginstalan

Jika pengguna mengklik Terima, semua izin yang diminta aplikasi akan diberikan. Jika pengguna menolak permintaan izin, sistem akan membatalkan penginstalan aplikasi.

Jika update aplikasi menyertakan kebutuhan izin tambahan, pengguna akan diminta untuk menerima izin baru tersebut sebelum mengupdate aplikasi.

Untuk melihat ringkasan tentang pola pengalaman pengguna yang direkomendasikan untuk meminta izin, lihat Praktik Terbaik Izin Aplikasi.

Untuk mempelajari cara memeriksa dan meminta izin dari pengguna, lihat Meminta Izin Aplikasi.

Permintaan yang memerlukan akses informasi sensitif pengguna

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.

Izin untuk fitur hardware opsional

Akses ke beberapa fitur hardware (seperti Bluetooth atau kamera) memerlukan izin aplikasi. Namun, tidak semua perangkat Android benar-benar memiliki fitur hardware ini. Jadi, jika aplikasi Anda meminta izin CAMERA, Anda juga harus menyertakan tag <uses-feature> dalam manifes untuk mendeklarasikan apakah fitur ini benar-benar diperlukan atau tidak. Contoh:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Jika Anda mendeklarasikan android:required="false" untuk fitur tersebut, Google Play akan memungkinkan aplikasi Anda diinstal di perangkat yang tidak memiliki fitur tersebut. Selanjutnya, Anda harus memeriksa apakah perangkat saat ini memiliki fitur itu pada saat waktu proses dengan memanggil PackageManager.hasSystemFeature(), lalu menonaktifkan fitur tersebut dengan baik jika tidak tersedia.

Jika Anda tidak memberikan tag <uses-feature>, saat Google Play melihat aplikasi Anda meminta izin yang sesuai, tindakan tersebut mengasumsikan bahwa aplikasi Anda memerlukan fitur ini. Jadi, Google Play memfilter aplikasi Anda dari perangkat yang tidak memiliki fitur tersebut, seolah-olah Anda mendeklarasikan android:required="true" di dalam tag <uses-feature>.

Untuk informasi selengkapnya, lihat Google Play dan pemfilteran berbasis fitur

Penerapan izin

Izin tidak hanya untuk meminta fungsionalitas sistem. Layanan yang disediakan oleh aplikasi dapat menerapkan izin kustom untuk membatasi siapa yang dapat menggunakannya. Untuk informasi selengkapnya tentang mendeklarasikan izin kustom, lihat Menentukan Izin Aplikasi Kustom.

Penerapan izin aktivitas

Izin yang diterapkan menggunakan atribut android:permission pada tag <activity> di dalam manifes membatasi siapa yang dapat memulai Activity. Izin diperiksa selama Context.startActivity() dan Activity.startActivityForResult(). Jika pemanggil tidak memiliki izin yang diperlukan, SecurityException akan dibuang dari panggilan.

Penerapan izin layanan

Izin yang diterapkan menggunakan atribut android:permission pada tag <service> di dalam manifes membatasi siapa yang dapat memulai atau mengikat ke Service yang terkait. Izin diperiksa selama Context.startService(), Context.stopService(), dan Context.bindService(). Jika pemanggil tidak memiliki izin yang diperlukan, SecurityException akan dibuang dari panggilan.

Penerapan izin siaran

Izin yang diterapkan menggunakan atribut android:permission pada tag <receiver> membatasi siapa yang dapat mengirim siaran ke BroadcastReceiver yang terkait. Izin diperiksa setelah Context.sendBroadcast() ditampilkan, karena sistem mencoba untuk mengirim siaran yang dikirim ke penerima yang dituju. Akibatnya, kegagalan izin tidak menghasilkan pengecualian yang dikembalikan ke pemanggil; melainkan hanya tidak menayangkan Intent.

Dengan cara yang sama, sebuah izin dapat diberikan ke Context.registerReceiver() untuk mengontrol siapa yang dapat melakukan siaran ke penerima yang terdaftar lewat program. Sebaliknya, izin dapat diberikan saat memanggil Context.sendBroadcast() untuk membatasi penerima siaran mana yang diizinkan untuk menerima siaran.

Perhatikan bahwa baik penerima maupun penyiar dapat memerlukan izin. Saat hal ini terjadi, kedua pemeriksaan izin harus lolos agar intent dapat dikirim ke target yang sesuai. Untuk informasi selengkapnya, lihat Membatasi siaran dengan izin.

Penerapan izin Penyedia Konten

Izin yang diterapkan menggunakan atribut android:permission pada tag <provider> membatasi siapa yang dapat mengakses data di ContentProvider. (Penyedia konten memiliki fasilitas keamanan tambahan penting yang tersedia untuk bagi mereka bernama izin URI yang akan dijelaskan selanjutnya.) Tidak seperti komponen lain, ada dua atribut izin terpisah yang dapat Anda atur: android:readPermission membatasi siapa yang dapat membaca dari penyedia, dan android:writePermission membatasi siapa yang dapat menulisnya. Perhatikan bahwa jika penyedia dilindungi dengan izin membaca dan menulis, memegang izin menulis saja tidak berarti Anda dapat membaca dari penyedia.

Izin diperiksa saat Anda pertama kali mengambil penyedia (jika Anda tidak memiliki izin apa pun, SecurityException akan ditampilkan), dan saat Anda melakukan operasi pada penyedia. Menggunakan ContentResolver.query() memerlukan izin membaca; menggunakan ContentResolver.insert(), ContentResolver.update(), ContentResolver.delete() memerlukan izin menulis. Dalam semua kasus ini, tidak memegang izin yang diperlukan akan menyebabkan SecurityException dihapus dari panggilan.

Izin URI

Sistem izin standar yang dijelaskan sejauh ini sering tidak memadai saat digunakan dengan penyedia konten. Penyedia konten dapat melindungi dirinya dengan izin membaca dan menulis, selama klien langsungnya juga perlu menyerahkan URI tertentu ke aplikasi lain agar dapat mengoperasikannya.

Contoh umumnya adalah lampiran dalam aplikasi email. Akses ke email harus dilindungi dengan izin, karena ini adalah data sensitif pengguna. Namun, jika URI ke lampiran gambar diberikan kepada penampil gambar, penampil gambar itu tidak lagi memiliki izin untuk membuka lampiran karena tidak memiliki alasan untuk memegang izin guna mengakses semua email.

Solusi dari masalah ini adalah izin per-URI: saat memulai sebuah aktivitas atau mengembalikan hasil dari suatu aktivitas, pemanggil dapat menyetel Intent.FLAG_GRANT_READ_URI_PERMISSION dan/atau Intent.FLAG_GRANT_WRITE_URI_PERMISSION. Ini akan memberikan izin pada aktivitas yang menerima untuk mengakses URI data spesifik dalam intent, baik saat aktivitas itu memiliki izin untuk mengakses data pada penyedia konten yang terkait dengan intent atau tidak.

Mekanisme ini memungkinkan model jenis kemampuan umum di mana interaksi pengguna (misalnya membuka lampiran atau memilih kontak dari daftar) akan mendorong pemberian izin sementara yang lebih sempit. Hal ini dapat menjadi fasilitas utama untuk mengurangi permintaan izin pada aplikasi dengan hanya mengizinkan izin yang terkait langsung dengan perilaku mereka.

Untuk membuat implementasi paling aman yang membuat aplikasi lain bertanggung jawab atas tindakannya terhadap aplikasi Anda, Anda harus menggunakan izin yang sangat detail dengan cara seperti ini dan mendeklarasikan dukungan aplikasi Anda untuk aplikasi dengan atribut android:grantUriPermissions atau tag <grant-uri-permissions>.

Informasi lebih lanjut dapat ditemukan pada metode Context.grantUriPermission(), Context.revokeUriPermission(), dan Context.checkUriPermission().

Penerapan izin lainnya

Izin acak yang sangat detail dapat diterapkan pada setiap panggilan ke layanan. Hal ini tercapai dengan metode Context.checkCallingPermission(). Panggil dengan string izin yang diinginkan maka string akan menampilkan integer yang menunjukkan apakah izin tersebut telah diberikan pada proses panggilan saat ini. Perhatikan bahwa hal ini hanya dapat digunakan jika Anda mengeksekusi panggilan yang datang dari proses lain, biasanya melalui antarmuka IDL yang diterbitkan dari layanan atau cara lain yang diberikan ke proses lain.

Ada sejumlah cara berguna lainnya untuk memeriksa izin. Jika Anda memiliki ID proses (PID) dari proses lain, Anda dapat menggunakan metode Context.checkPermission() untuk memeriksa izin terhadap PID tersebut. Jika memiliki nama paket aplikasi lain, Anda dapat menggunakan metode PackageManager.checkPermission() untuk mengetahui apakah paket tertentu tersebut telah diberi izin khusus.

Penyesuaian izin otomatis

Seiring waktu, batasan baru dapat ditambahkan ke platform sedemikian rupa sehingga dapat menggunakan API tertentu, aplikasi Anda harus meminta izin yang sebelumnya tidak diperlukan. Karena aplikasi yang ada mengasumsikan akses ke API tersebut tersedia secara bebas, Android dapat menerapkan permintaan izin baru ke manifes aplikasi untuk mencegah merusak aplikasi pada versi platform baru (sehingga, "mendasari" aplikasi Anda untuk izin). Android memutuskan apakah aplikasi memerlukan izin berdasarkan nilai yang disediakan untuk atribut targetSdkVersion atau tidak. Jika nilainya lebih rendah daripada versi yang izinnya ditambahkan, maka Android akan menambahkan izin tersebut.

Misalnya, izin READ_EXTERNAL_STORAGE diterapkan mulai dari API level 19 untuk membatasi akses ke ruang penyimpanan bersama. Jika targetSdkVersion Anda 3 atau lebih rendah, izin akan ditambahkan ke aplikasi Anda pada versi Android yang lebih baru.

Perhatian: Jika izin otomatis ditambahkan ke aplikasi Anda, maka listing aplikasi pada Google Play akan mencantumkan izin tambahan ini meskipun aplikasi Anda mungkin tidak memerlukan izin tambahan tersebut. Untuk menghindari hal ini dan membuang izin default yang tidak dibutuhkan, selalu update targetSdkVersion Anda ke versi yang paling baru. Anda dapat melihat izin yang ditambahkan pada masing-masing rilis dalam dokumentasi Build.VERSION_CODES.

Level perlindungan

Izin dibagi menjadi beberapa level perlindungan. Level perlindungan memengaruhi apakah permintaan izin waktu proses diperlukan atau tidak.

Ada tiga level perlindungan yang memengaruhi aplikasi pihak ketiga: izin normal, tanda tangan, dan berbahaya. Untuk menampilkan level perlindungan yang dimiliki oleh izin tertentu, buka halaman referensi API izin.

Izin normal

Izin Normal mencakup area tempat aplikasi Anda memerlukan data akses atau sumber di luar sandbox aplikasi, tetapi ada sedikit resiko terhadap privasi pengguna atau operasi dari aplikasi lain. Misalnya, izin untuk menyetel zona waktu adalah izin normal.

Jika aplikasi mendeklarasikan dalam manifesnya bahwa aplikasi tersebut memerlukan izin normal, sistem akan otomatis memberikan aplikasi tersebut izin pada waktu penginstalan. Sistem tidak meminta pengguna untuk memberikan izin normal, dan pengguna tidak dapat mencabut izin ini.

Izin tanda tangan

Sistem memberikan izin aplikasi ini pada waktu penginstalan, tetapi hanya saat aplikasi yang mencoba menggunakan izin ditandatangani oleh sertifikat yang sama dengan aplikasi yang menentukan izin tersebut.

Izin berbahaya

Izin Berbahaya mencakup area tempat aplikasi menginginkan data atau resource yang melibatkan informasi pribadi pengguna, atau berpotensi memengaruhi data yang disimpan pengguna atau operasi aplikasi lain. Misalnya, kemampuan untuk membaca kontak pengguna adalah izin yang berbahaya. Jika aplikasi mendeklarasikan bahwa aplikasi memerlukan izin berbahaya, pengguna harus memberikan izin secara eksplisit pada aplikasi tersebut. Sampai pengguna menyetujui izin, aplikasi Anda tidak dapat menyediakan fungsionalitas yang bergantung pada izin tersebut.

Untuk menggunakan izin berbahaya, aplikasi Anda harus meminta pengguna untuk memberikan izin saat waktu proses. Untuk mengetahui informasi selengkapnya tentang cara meminta izin pengguna, lihat Meminta izin pengguna untuk izin berbahaya.

Izin khusus

Ada beberapa izin yang tidak bertindak seperti izin normal dan berbahaya. SYSTEM_ALERT_WINDOW dan WRITE_SETTINGS sangat sensitif, sehingga sebagian besar aplikasi tidak boleh menggunakannya. Jika aplikasi membutuhkan salah satu dari izin tersebut, aplikasi harus mendeklarasikan izin dalam manifes, dan mengirim intent yang meminta otorisasi pengguna. Sistem akan merespons intent tersebut dengan menampilkan layar pengelolaan mendetail kepada pengguna.

Untuk rincian bagaimana cara meminta izin ini, lihat entri referensi SYSTEM_ALERT_WINDOW dan WRITE_SETTINGS.

Izin yang disediakan oleh sistem Android dapat ditemukan di Manifest.permission.

Grup Izin

Izin dikelompokkan ke dalam grup menurut kemampuan atau fitur suatu perangkat. Dengan sistem ini, permintaan izin ditangani pada tingkat grup dan satu grup izin sesuai dengan beberapa deklarasi izin dalam manifes aplikasi. Misalnya, grup SMS menyertakan deklarasi READ_SMS dan RECEIVE_SMS. Mengelompokkan izin dengan cara ini membuat pengguna dapat menentukan pilihan yang lebih tepat dan benar, tanpa harus dibingungkan dengan permintaan izin teknis dan kompleks.

Semua izin sistem Android yang berbahaya termasuk dalam grup izin. Setiap izin dapat tergabung dalam grup izin terlepas dari tingkat perlindungannya. Namun, izin dari grup hanya berdampak pada pengalaman pengguna jika izin tersebut berbahaya.

Jika perangkat berjalan di Android 6.0 (API level 23) dan aplikasi targetSdkVersion adalah 23 atau lebih tinggi, perilaku sistem berikut akan diterapkan ketika aplikasi meminta izin berbahaya:

  • Jika saat ini aplikasi tidak memiliki izin dalam grup izin, sistem akan menampilkan dialog permintaan izin kepada pengguna yang menjelaskan grup izin yang ingin diakses aplikasi. Dialog tidak menjelaskan izin khusus dalam grup tersebut. Misalnya, jika aplikasi meminta izin READ_CONTACTS, dialog sistem hanya mengatakan bahwa aplikasi memerlukan akses ke kontak perangkat. Jika pengguna memberikan persetujuannya, sistem hanya akan memberi aplikasi izin yang diminta.
  • Jika aplikasi telah diberi izin berbahaya lain dalam grup izin yang sama, sistem segera memberikan izin tanpa ada interaksi dengan pengguna. Misalnya, jika aplikasi sebelumnya telah meminta dan diberi izin READ_CONTACTS, lalu meminta WRITE_CONTACTS, sistem akan langsung memberikan izin tersebut tanpa menampilkan dialog izin kepada pengguna.

Perhatian: Versi Android SDK yang akan datang mungkin memindahkan izin tertentu dari satu grup ke grup lain. Oleh karena itu, jangan mendasarkan logika aplikasi Anda pada struktur grup izin ini.

Misalnya, READ_CONTACTS adalah grup izin yang sama dengan WRITE_CONTACTS pada Android 8.1 (API level 27). Jika aplikasi Anda meminta izin READ_CONTACTS, lalu meminta izin WRITE_CONTACTS, jangan berasumsi bahwa sistem dapat memberikan izin WRITE_CONTACTS secara otomatis.

Jika perangkat berjalan di Android 5.1 (API level 22) atau lebih rendah, atau targetSdkVersion aplikasi adalah 22 atau lebih rendah, sistem akan meminta izin kepada pengguna pada waktu penginstalan: Sekali lagi, sistem hanya memberitahu pengguna grup izin apa yang dibutuhkan aplikasi, bukan izin individu. Misalnya, saat aplikasi meminta READ_CONTACTS, dialog penginstalan akan mencantumkan grup Kontak. Saat pengguna menerima permintaan tersebut, hanya izin READ_CONTACTS yang akan diberikan ke aplikasi.

Catatan: Aplikasi Anda tetap harus meminta setiap izin yang diperlukan secara eksplisit, meskipun pengguna telah memberikan izin lain dalam grup yang sama. Selain itu, pengelompokan izin ke dalam grup dapat berubah dalam rilis Android mendatang. Kode tidak boleh memiliki logika yang bergantung pada set izin tertentu yang berada pada grup yang sama.

Melihat izin aplikasi

Anda dapat melihat semua izin yang saat ini ditentukan dalam sistem menggunakan aplikasi Setelan dan perintah shell adb shell pm list permissions. Untuk menggunakan aplikasi Setelan, buka Setelan > Aplikasi. Pilih aplikasi dan scroll ke bawah untuk melihat izin yang digunakan aplikasi. Untuk developer, opsi adb '-s' menampilkan izin dalam bentuk yang sama dengan yang akan dilihat pengguna:

$ adb shell pm list permissions -s
All Permissions:

Network communication: view Wi-Fi state, create Bluetooth connections, full
internet access, view network state

Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location

Services that cost you money: send SMS messages, directly call phone numbers

...

Anda juga dapat menggunakan opsi -g adb untuk memberikan semua izin secara otomatis saat menginstal aplikasi di emulator atau perangkat pengujian:

$ adb shell install -g MyApp.apk

Resource lainnya

  • Meminta izin aplikasi: Panduan cara kerja untuk meminta izin di aplikasi Anda.
  • Izin yang menyiratkan persyaratan fitur: Informasi tentang cara meminta beberapa izin akan secara implisit membatasi aplikasi Anda ke perangkat yang menyertakan fitur hardware atau software yang terkait.
  • <uses-permission>: Referensi API untuk tag manifes yang mendeklarasikan izin yang diperlukan aplikasi Anda.
  • Kompatibilitas perangkat: Informasi tentang cara Android bekerja pada jenis perangkat yang berbeda dan pengenalan mengenai cara mengoptimalkan aplikasi untuk setiap perangkat atau membatasi ketersediaan aplikasi Anda untuk perangkat berbeda.
  • Ringkasan Keamanan Android: Pembahasan mendetail mengenai model keamanan platform Android.
  • "Ibu, Bolehkah saya?" Meminta Izin: Video ini dari Android Dev Summit 2015 yang menjelaskan praktik terbaik untuk meminta izin.
  • Izin Android M: Video ini dari Google I/O 2015 yang menjelaskan perubahan yang dibuat untuk model izin di Android 6.0.