Izin Sistem

Pola Desain

Izin

Video

Google I/O 2015—Izin Android M: Praktik Terbaik bagi Developer

Android merupakan sistem operasi dengan privilese terpisah, di mana setiap aplikasi berjalan dengan identitas sistem yang berbeda (ID pengguna Linux dan ID Grup). Bagian dari sistem juga terpisah menjadi identitas berbeda. Linux dengan ini mengisolasi aplikasi dari masing-masing dan dari sistem.

Fitur keamanan tambahan yang lebih terperinci disediakan melalui mekanisme "izin" yang memberlakukan pembatasan pada operasi spesifik yang dapat dilaksanakan oleh proses tertentu, dan izin per-URI untuk memberikan akses sementara ke bagian data spesifik.

Dokumen ini menjelaskan bagaimana developer aplikasi dapat menggunakan fitur keamanan yang disediakan oleh Android. Ringkasan Keamanan Android yang lebih umum disediakan dalam Proyek Sumber Terbuka Android.

Arsitektur Keamanan

Secara default, poin penting desain arsitektur keamanan Android adalah tidak ada aplikasi yang diizinkan untuk melakukan operasi apa pun yang akan berdampak buruk pada aplikasi lain, sistem operasi, atau pengguna. Ini termasuk membaca atau menulis data privat pengguna (seperti kontak atau email), membaca atau menulis file aplikasi lain, melakukan akses jaringan, menjaga perangkat tetap bangun, dan sebagainya.

Karena setiap aplikasi Android beroperasi dalam kotak pasir proses, aplikasi harus secara eksplisit berbagi sumber daya dan data. Ini dilakukan dengan mendeklarasikan izin yang dibutuhkan untuk menambah kemampuan yang tidak disediakan oleh kotak pasir dasar. Aplikasi secara statistik mendeklarasikan izin yang mereka butuhkan, dan sistem Android meminta persetujuan pengguna.

Kotak pasir aplikasi tidak bergantung pada teknologi yang digunakan untuk membangun aplikasi. Secara khusus Dalvik VM bukanlah batasan keamanan, dan setiap aplikasi dapat menjalankan kode asli (lihat Android NDK). Semua jenis aplikasi — Java, asli, dan hibrid — dimasukkan pada kotak pasir dengan cara yang sama dan satu sama lain memiliki derajat keamanan yang sama.

Penandatanganan Aplikasi

Semua APK (file .apk) harus ditandatangani dengan sertifikat yang kunci pribadinya dipegang oleh developer-nya. Sertifikat ini mengidentifikasi penulis aplikasi. Sertifikat tidak perlu ditandatangani oleh otoritas sertifikat; hal ini memang diizinkan, dan umumnya, bagi aplikasi Android untuk menggunakan sertifikat yang ditandatangani sendiri. Tujuan dari sertifikat dalam Android adalah untuk membedakan penulis aplikasi. Hal ini memungkinkan sistem untuk memberikan atau menolak akses aplikasi ke izin tingkat tanda tangan dan untuk memberikan atau menolak permintaan aplikasi untuk diberi identitas Linux yang sama seperti aplikasi lainnya.

ID Pengguna dan Akses File

Pada waktu pemasangan, Android memberikan ID pengguna Linux yang unik untuk setiap paket. Identitas tetap konstan selama durasi umur paket pada perangkat tersebut. Pada perangkat berbeda, paket yang sama mungkin memiliki UID berbeda; yang penting adalah setiap paket memiliki UID unik pada perangkat yang diberikan.

Karena pemberlakuan keamanan terjadi di tingkat proses, kode dari setiap dua paket tidak dapat berjalan normal dalam proses yang sama, karena keduanya harus berjalan sebagai pengguna Linux berbeda. Anda bisa menggunakan atribut sharedUserId dalam tag manifest milik AndroidManifest.xml dari setiap paket untuk menugaskannya ke ID pengguna yang sama. Dengan melakukan ini, demi keamanan, kedua paket ini kemudian dianggap sebagai aplikasi yang sama, dengan ID pengguna dan izin file yang sama. Perhatikan bahwa untuk mempertahankan keamanan, hanya dua aplikasi yang ditandatangani dengan tanda tangan yang sama (dan meminta sharedUserId yang sama) akan diberi ID pengguna yang sama.

Setiap data yang disimpan oleh aplikasi akan ditetapkan dengan ID pengguna aplikasi itu, dan biasanya tidak dapat diakses oleh paket lainnya. Saat membuat file baru dengan getSharedPreferences(String, int), openFileOutput(String, int), atau openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory), Anda bisa menggunakan flag MODE_WORLD_READABLE dan/atau MODE_WORLD_WRITEABLE agar paket lain mana pun membaca/menulis file. Ketika menyetel flag ini, file masih dimiliki oleh aplikasi Anda, namun, izin global untuk membaca dan/atau menulisnya telah disetel sebagaimana mestinya sehingga aplikasi lain dapat melihatnya.

Menggunakan Izin

Aplikasi Android dasar tidak memiliki izin yang terkait dengannya secara default, ini berarti bahwa aplikasi tidak dapat melakukan apa pun yang akan berdampak merugikan pada pengalaman pengguna atau data apa pun pada perangkat. Untuk memanfaatkan fitur perangkat yang diproteksi, Anda harus menyertakan satu atau beberapa tag <uses-permission> dalam manifes aplikasi Anda.

Misalnya, aplikasi yang harus memantau pesan SMS masuk akan menetapkan:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app.myapp" >
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    ...
</manifest>

Jika aplikasi Anda mencantumkan izin biasa dalam manifesnya (yaitu izin yang tidak menunjukkan banyak risiko pada privasi pengguna atau pengoperasian perangkat), sistem secara otomatis memberikan izin-izin tersebut. Jika aplikasi Anda mencantumkan izin berbahaya dalam manifesnya (yaitu izin yang berpotensi memengaruhi privasi pengguna atau pengoperasian normal perangkat), sistem akan meminta pengguna untuk secara eksplisit memberikan izin tersebut. Cara Android membuat permintaan bergantung pada versi sistem, dan versi sistem yang disasar oleh aplikasi Anda.

  • Jika perangkat menjalankan Android 6.0 (API level 23) atau yang lebih tinggi, dan targetSdkVersion aplikasi adalah 23 atau yang lebih tinggi, aplikasi akan meminta izin dari pengguna saat waktu proses. Pengguna dapat mencabut izin ini setiap saat, jadi aplikasi harus memeriksa apakah ia memiliki izin setiap kali aplikasi berjalan. Untuk informasi selengkapnya tentang meminta izin dalam aplikasi, lihat pedoman pelatihan Bekerja dengan Izin Sistem.
  • Jika perangkat menjalankan Android 5.1 (API level 22) atau yang lebih rendah, atau targetSdkVersion aplikasi adalah 22 atau lebih rendah, sistem akan meminta pengguna untuk memberikan izin ketika pengguna memasang aplikasi. Jika Anda menambahkan izin baru ke versi aplikasi yang telah diperbarui, sistem akan meminta pengguna memberikan izin itu ketika aplikasi diperbarui. Setelah pengguna memasang aplikasi, satu-satunya cara mencabut izin adalah dengan mencopot pemasangan aplikasi.

Sering kali kegagalan izin akan berakibat SecurityException dikembalikan ke aplikasi. Akan tetapi, hal ini tidak menjamin akan terjadi di mana saja. Misalnya, metode sendBroadcast(Intent) memeriksa izin sewaktu data dikirim ke masing-masing penerima, setelah panggilan metode dikembalikan, jadi Anda tidak akan menerima pengecualian jika ada kegagalan izin. Namun, dalam banyak kasus, kegagalan izin akan dicetak ke log sistem.

Izin yang disediakan oleh sistem Android dapat ditemukan di Manifest.permission. Semua aplikasi juga dapat mendefinisikan dan memberlakukan izinnya sendiri, jadi ini bukanlah daftar komprehensif semua kemungkinan izin.

Sebuah izin spesial bisa diberlakukan di sejumlah tempat selama program Anda beroperasi:

  • Saat panggilan ke sistem, untuk mencegah suatu aplikasi mengeksekusi fungsi tertentu.
  • Ketika memulai sebuah aktivitas, untuk mencegah aplikasi meluncurkan aktivitas aplikasi lain.
  • Baik mengirim maupun menerima siaran, untuk memantau siapa saja yang dapat menerima siaran Anda atau yang dapat mengirim siaran kepada Anda.
  • Ketika mengakses dan beroperasi pada suatu penyedia materi.
  • Mengikat atau memulai suatu layanan.

Penyesuaian izin otomatis

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

Misalnya, izin WRITE_EXTERNAL_STORAGE ditambahkan pada API level 4 untuk mencegah akses ke ruang penyimpanan bersama. Jika targetSdkVersion Anda 3 atau yang lebih rendah, izin akan ditambahkan ke aplikasi Anda pada versi Android yang lebih baru.

Perhatian: Jika sebuah izin ditambahkan secara otomatis ke aplikasi Anda, cantuman aplikasi Anda di Google Play akan mendaftarkan izin tambahan ini meski aplikasi Anda mungkin tidak membutuhkannya.

Untuk menghindari hal ini dan membuang izin default yang tidak dibutuhkan, selalu perbarui targetSdkVersion Anda setinggi mungkin. Anda bisa melihat izin yang ditambahkan pada masing-masing rilis dalam dokumentasi Build.VERSION_CODES.

Izin Biasa dan Berbahaya

Izin sistem dibagi ke dalam sejumlah tingkat perlindungan. Dua tingkat perlindungan terpenting yang perlu diketahui adalah izin biasa dan berbahaya:

  • Izin Biasa mencakup area tempat aplikasi Anda memerlukan data akses atau sumber daya di luar kotak pasir aplikasi, tapi memiliki risiko sangar kecil terhadap privasi pengguna atau operasi dari aplikasi lain. Misalnya, izin untuk menyetel zona waktu adalah izin biasa. Jika sebuah aplikasi mendeklarasikan bahwa aplikasi itu memerlukan izin biasa, sistem secara otomatis akan mengizinkan aplikasi. Untuk mengetahui daftar lengkap dari izin biasa saat ini, lihat Izin biasa.
  • Izin Berbahaya mencakup area tempat aplikasi meminta data atau sumber daya yang melibatkan informasi pribadi pengguna, atau bisa berdampak terhadap data pengguna yang tersimpan atau terhadap operasi aplikasi lain. Misalnya, kemampuan untuk membaca kontak pengguna adalah izin berbahaya. Jika sebuah aplikasi mendeklarasikan bahwa ia membutuhkan izin berbahaya, pengguna harus memberikan izin secara eksplisit kepada aplikasi tersebut.

Grup izin

Semua izin sistem Android yang berbahaya dimiliki oleh grup izin. Jika perangkat menjalankan Android 6.0 (API level 23) dan targetSdkVersion aplikasi adalah 23 atau yang lebih tinggi, perilaku sistem berikut akan diterapkan ketika aplikasi meminta izin berbahaya:

  • Jika sebuah aplikasi meminta izin berbahaya yang tercantum dalam manifesnya, dan aplikasi saat ini tidak memiliki izin apa pun pada grup izin, sistem akan menampilkan sebuah kotak dialog yang menjelaskan grup izin yang aksesnya diinginkan oleh aplikasi. Kotak dialog ini tidak menjelaskan izin secara khusus di dalam grup tersebut. Misalnya, jika aplikasi meminta izin READ_CONTACTS, kotak dialog sistem hanya mengatakan bahwa aplikasi Anda membutuhkan akses ke kontak perangkat. Jika pengguna memberikan persetujuannya, sistem hanya akan memberikan izin yang diminta ke aplikasi.
  • Jika sebuah aplikasi meminta izin berbahaya yang terdaftar pada manifesnya, dan aplikasi sudah memiliki izin berbahaya lain pada grup izin yang sama, maka sistem akan segera memberikan izin tanpa interaksi apa pun dengan pengguna. Misalnya, jika sebuah aplikasi sebelumnya telah meminta dan diberikan izin READ_CONTACTS, kemudian meminta WRITE_CONTACTS, sistem akan segera memberikan izin tersebut.

Izin apa pun dapat dimiliki oleh sebuah grup izin, termasuk izin biasa dan izin yang didefinisikan oleh aplikasi Anda. Akan tetapi, grup izin hanya memberi dampak pada pengalaman pengguna jika izin tersebut berbahaya. Anda bisa mengabaikan grup izin untuk izin biasa.

Jika perangkat menjalankan Android 5.1 (API level 22) atau yang lebih rendah, atau targetSdkVersion aplikasi adalah 22 atau yang lebih rendah, sistem akan meminta pengguna untuk memberikan izin pada waktu pemasangan: Sekali lagi, sistem hanya memberi tahu pengguna grup izin yang dibutuhkan aplikasi, bukan satu per satu izin.

Tabel 1. Izin berbahaya dan grup izin.

Grup Izin Izin
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE

Mendefinisikan dan Memberlakukan Izin

Untuk memberlakukan izin sendiri, Anda harus mendeklarasikannya terlebih dahulu di AndroidManifest.xml menggunakan satu atau beberapa elemen <permission>.

Misalnya, sebuah aplikasi yang ingin mengontrol siapa yang bisa memulai salah satu aktivitasnya dapat mendeklarasikan izin untuk operasi ini seperti berikut:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp" >
    <permission android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
        android:label="@string/permlab_deadlyActivity"
        android:description="@string/permdesc_deadlyActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="dangerous" />
    ...
</manifest>

Catatan: Sistem tidak mengizinkan beberapa paket untuk mendeklarasikan suatu izin dengan nama yang sama, kecuali jika semua paket ditandatangani dengan sertifikat yang sama. Jika paket mendeklarasikan suatu izin, sistem tidak akan mengizinkan pengguna untuk memasang paket lain dengan nama izin yang sama, kecuali jika paket tersebut ditandatangani dengan sertifikat yang sama seperti paket pertama. Untuk menghindari bentrokan penamaan, kami menyarankan penggunaan penamaan bergaya domain terbalik untuk izin khusus, misalnya com.example.myapp.ENGAGE_HYPERSPACE.

Atribut protectionLevel diperlukan, yang memberi tahu sistem cara pengguna akan diberi informasi dari aplikasi yang membutuhkan izin, atau siapa yang diperbolehkan untuk memegang izin itu, seperti yang dijelaskan dalam dokumentasi yang ditautkan.

Atribut android:permissionGroup adalah opsional, dan hanya digunakan untuk membantu sistem menampilkan izin kepada pengguna. Pada kebanyakan kasus Anda mungkin ingin menyetelnya ke grup sistem standar (terdaftar di android.Manifest.permission_group), meskipun Anda bisa mendefinisikan grup sendiri. Akan lebih baik untuk menggunakan grup yang sudah ada, karena akan menyederhanakan izin yang ditampilkan UI kepada pengguna.

Anda perlu melengkapi label dan keterangan untuk izin. Berikut adalah sumber daya string yang dapat dilihat pengguna saat mereka melihat daftar izin (android:label) atau detail pada satu izin (android:description). Label haruslah pendek; beberapa kata yang menjelaskan inti fungsionalitas yang dilindungi oleh izin. Keterangan haruslah berupa beberapa kalimat yang menjelaskan apa saja yang dapat dilakukan pemegang izin. Standar kami untuk keterangan adalah dua kalimat: kalimat pertama menjelaskan izin, dan yang kedua memperingatkan pengguna masalah apa saja yang bisa terjadi jika sebuah aplikasi mendapatkan izin tersebut.

Inilah contoh label dan keterangan untuk izin CALL_PHONE:

<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the application to call
    phone numbers without your intervention. Malicious applications may
    cause unexpected calls on your phone bill. Note that this does not
    allow the application to call emergency numbers.</string>

Anda bisa menampilkan izin yang saat ini didefinisikan dalam sistem menggunakan aplikasi Settings dan perintah shell adb shell pm list permissions. Untuk menggunakan aplikasi Settings, buka Settings > Applications. Pilih aplikasi dan gulirkan ke bawah untuk melihat izin yang digunakan aplikasi. Untuk developer, opsi adb '-s' menampilkan izin dalam bentuk yang serupa 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

...

Saran izin khusus

Aplikasi dapat menentukan izin khususnya sendiri dan meminta izin khusus dari aplikasi lain dengan mendefinisikan elemen <uses-permission>. Akan tetapi, Anda harus menilai secara hati-hati apakah aplikasi Anda perlu melakukannya.

  • Jika Anda mendesain paket aplikasi yang saling mengekspos fungsionalitas, cobalah mendesain aplikasi yang izinnya didefinisikan hanya satu kali. Anda harus melakukan ini jika aplikasi tidak semuanya ditandatangani dengan sertifikat yang sama. Meskipun aplikasi ditandatangani semuanya dengan sertifikat yang sama, sebaiknya definisikan setiap izin sekali saja.
  • Jika fungsionalitasnya hanya tersedia untuk aplikasi yang ditandatangani dengan tanda tangan yang sama dengan yang disediakan aplikasi, Anda bisa menghindari mendefinisikan izin khusus dengan menggunakan pemeriksaan tanda tangan. Bila salah satu aplikasi membuat permintaan ke aplikasi Anda yang lain, aplikasi kedua akan dapat memverifikasi bahwa kedua aplikasi telah ditandatangani dengan sertifikat yang sama sebelum menyetujui permintaan tersebut.
  • Jika Anda sedang mengembangkan paket aplikasi yang hanya berjalan di perangkat sendiri, Anda harus mengembangkan dan memasang paket yang mengelola izin itu untuk semua aplikasi dalam paket. Paket ini tidak perlu menyediakan sendiri layanan apa pun. Paket hanya mendeklarasikan semua izin, dan aplikasi lain dalam suite akan meminta izin tersebut dengan elemen <uses-permission>.

Memberlakukan Izin di AndroidManifest.xml

Anda bisa menerapkan akses yang membatasi izin tingkat tinggi ke seluruh komponen dari sistem atau aplikasi melalui AndroidManifest.xml. Untuk melakukannya, sertakan atribut android:permission pada komponen yang diinginkan, memberi nama pada izin yang mengontrol aksesnya.

Izin Activity (yang diterapkan pada tag <activity>) membatasi orang yang dapat memulai aktivitas yang terkait. Izin diperiksa selama Context.startActivity() dan Activity.startActivityForResult(); jika pemanggil tidak memiliki izin yang diperlukan maka SecurityException akan dilontarkan dari panggilan.

Izin Service (yang diterapkan pada tag <service>) menghalangi orang yang dapat memulai atau mengikat layanan yang terkait. Izin diperiksa selama Context.startService(), Context.stopService() dan Context.bindService(); jika pemanggil tidak memiliki izin yang dibutuhkan maka SecurityException akan dilontarkan dari panggilan.

Izin BroadcastReceiver (yang diterapkan ke tag <receiver>) menghalangi orang yang dapat mengirim siaran ke penerima yang terkait. Izin diperiksa setelah Context.sendBroadcast() kembali, dikarenakan sistem mencoba untuk mengirim siaran yang dikirim ke penerima yang dituju. Hasilnya, kegagalan izin tidak mengakibatkan pengecualian dilontarkan ke pemanggil; cuma tidak akan menyampaikan maksudnya. Dengan cara yang sama, sebuah izin dapat dipasok ke Context.registerReceiver() untuk mengontrol siapa yang dapat menyiarkan ke penerima yang terdaftar lewat program. Sebaliknya, sebuah izin dapat dipasok saat memanggil Context.sendBroadcast() untuk membatasi objek BroadcastReceiver mana yang dibolehkan menerima siaran (lihat di bawah).

Izin ContentProvider (yang diterapkan ke tag <provider>) membatasi siapa yang dapat mengakses data dalam sebuah ContentProvider. (Penyedia materi memiliki fasilitas tambahan penting yang memungkinkan mereka memanggil Izin URI yang akan dijelaskan nanti.) 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, jika penyedia dilindungi dengan izin baca dan tulis, memegang izin menulis saja tidak berarti Anda bisa membaca dari penyedia. Izin diperiksa saat Anda pertama kali mengambil penyedia (jika Anda tidak memiliki izin apa pun, SecurityException akan dibuang), dan saat Anda melakukan operasi pada penyedia. Menggunakan ContentResolver.query() memerlukan izin baca; menggunakan ContentResolver.insert(), ContentResolver.update(), ContentResolver.delete() memerlukan izin tulis. Dalam semua kasus ini, tidak memegang izin yang diperlukan akan menyebabkan SecurityException dikeluarkan dari panggilan.

Memberlakukan Izin ketika Mengirim Siaran

Selain izin memberlakukan siapa yang dapat mengirim Maksud ke BroadcastReceiver terdaftar (seperti dijelaskan di atas), Anda juga bisa menetapkan izin yang diperlukan ketika mengirim siaran. Dengan memanggil Context.sendBroadcast() menggunakan string izin, Anda mengharuskan aplikasi penerima untuk menangguhkan izin itu guna menerima siaran Anda.

Perhatikan bahwa baik penerima maupun penyiar bisa memerlukan sebuah izin. Bila ini terjadi, kedua pemeriksaan izin harus lolos agar Maksud disampaikan ke target yang terkait.

Pemberlakuan Izin Lainnya

Izin sembarang yang lebih sempit dapat diberlakukan pada setiap panggilan ke layanan. Hal ini tercapai dengan metode Context.checkCallingPermission(). Panggillah dengan string izin yang diinginkan maka string akan mengembalikan integer yang menunjukkan apakah izin itu telah diberikan kepada proses panggilan saat ini. Perhatikan bahwa hal ini hanya dapat digunakan bila Anda mengeksekusi panggilan yang datang dari proses lain, biasanya melalui sebuah 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 pid dari proses lain, Anda bisa menggunakan metode Context Context.checkPermission(String, int, int) untuk memeriksa izin terhadap pid tersebut. Jika Anda memiliki sebuah nama paket dari aplikasi lain, Anda bisa menggunakan metode langsung PackageManager PackageManager.checkPermission(String, String) untuk mengetahui apakah paket tersebut telah diberikan izin tertentu.

Izin URI

Sistem izin standar yang dijelaskan sejauh ini sering tidak memadai ketika digunakan dengan penyedia materi. Penyedia materi dapat melindungi dirinya dengan izin tulis dan baca, selama klien langsungnya juga perlu menyerahkan URI tertentu ke aplikasi lain agar dapat mengoperasikannya. Contoh umum adalah lampiran dalam aplikasi email. Akses ke email harus dilindungi dengan izin, karena email merupakan data pengguna yang sensitif. Akan tetapi, jika sebuah URI ke lampiran gambar diberikan ke penampil gambar, maka penampil gambar tersebut tidak akan memiliki izin untuk membuka lampiran tersebut karena tidak memiliki alasan untuk memegang izin 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. Hal ini akan memberikan izin pada aktivitas yang menerima untuk mengakses URI data spesifik dalam Maksud, apakah aktivitas itu memiliki izin untuk mengakses data pada penyedia materi yang terkait dengan Maksud.

Mekanisme ini memungkinkan model jenis kemampuan yang mana interaksi pengguna (membuka lampiran, memilih kontak dari daftar, dsb) akan mendorong pemberian izin sementara yang lebih sempit. Hal ini bisa menjadi fasilitas utama untuk mengurangi izin yang diperlukan oleh aplikasi menjadi hanya untuk yang langsung terkait dengan perilakunya.

Namun pemberian izin URI yang lebih sempit, memerlukan suatu kerja sama dengan penyedia materi yang memegang URI tersebut. Penyedia materi sangat disarankan untuk mengimplementasikan fasilitas ini, dan mendeklarasikan bahwa mereka mendukungnya melalui atribut android:grantUriPermissions atau tag <grant-uri-permissions>.

Informasi selengkapnya bisa ditemukan dalam metode Context.grantUriPermission(), Context.revokeUriPermission(), dan Context.checkUriPermission().

Lanjutkan membaca tentang:

Izin yang Menegaskan Persyaratan Fitur
Informasi bahwa meminta beberapa izin akan secara implisit membatasi aplikasi Anda ke perangkat yang mencakup fitur perangkat keras atau perangkat lunak terkait.
<uses-permission>
Referensi API untuk tag manifes yang mendeklarasikan aplikasi Anda memerlukan izin sistem.
Manifest.permission
Referensi API untuk semua izin sistem.

Anda juga mungkin tertarik dengan:

Kompatibilitas Perangkat
Informasi tentang cara kerja Android pada berbagai tipe perangkat dan pengenalan mengenai cara mengoptimalkan aplikasi untuk setiap perangkat atau membatasi ketersediaan aplikasi Anda untuk perangkat berbeda.
Ringkasan Keamanan Android
Pembahasan detail tentang model keamanan platform Android.