Izin tidak hanya bertujuan untuk meminta fungsi sistem. Anda juga dapat membatasi cara aplikasi lain berinteraksi dengan komponen aplikasi Anda.
Panduan ini menjelaskan cara memeriksa kumpulan izin yang telah dideklarasikan aplikasi lain. Panduan ini juga menjelaskan cara mengonfigurasi aktivitas, layanan, penyedia konten, dan penerima siaran untuk membatasi cara aplikasi lain berinteraksi dengan aplikasi Anda.
Memeriksa izin aplikasi lain
Untuk melihat kumpulan izin yang dideklarasikan aplikasi lain, gunakan perangkat atau emulator untuk menyelesaikan langkah-langkah berikut:
- Buka layar Info aplikasi di aplikasi.
Pilih Izin. Layar Izin aplikasi akan dimuat.
Layar ini menampilkan kumpulan grup izin. Sistem mengatur kumpulan izin yang telah dideklarasikan aplikasi ke dalam grup ini.
Ada sejumlah cara berguna lainnya untuk memeriksa izin:
- Selama panggilan ke layanan, teruskan string izin ke
Context.checkCallingPermission()
. Metode ini menampilkan integer yang menunjukkan apakah izin tersebut telah diberikan untuk 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 dipublikasikan dari layanan atau diberikan dengan cara lain ke proses lain. - Untuk memeriksa apakah proses lain telah diberi izin tertentu, teruskan proses (PID) ke
Context.checkPermission()
. - Untuk memeriksa apakah paket lain telah diberi izin tertentu,
teruskan nama paket ke
PackageManager.checkPermission()
.
Membatasi interaksi dengan aktivitas aplikasi Anda
Gunakan atribut android:permission
pada
tag
<activity>
dalam manifes untuk membatasi aplikasi
lain mana yang dapat memulai
Activity
tersebut. Izin diperiksa
selama
Context.startActivity()
dan
Activity.startActivityForResult()
Jika pemanggil tidak memiliki izin yang diperlukan, maka
SecurityException
akan muncul.
Membatasi interaksi dengan layanan aplikasi Anda
Gunakan atribut android:permission
ke
tag
<service>
dalam manifes untuk membatasi aplikasi
lain mana yang dapat memulai atau mengikat ke
Service
terkait.
Izin diperiksa selama
Context.startService()
,
Context.stopService()
, dan
Context.bindService()
.
Jika pemanggil tidak memiliki izin yang diperlukan, maka SecurityException
akan muncul.
Membatasi interaksi dengan penyedia konten aplikasi Anda
Gunakan atribut android:permission
ke
tag
<provider>
untuk membatasi aplikasi lain yang dapat mengakses
data di
ContentProvider
.
(Penyedia konten memiliki fasilitas keamanan tambahan penting
yang tersedia bagi mereka yang disebut
izin URI yang dijelaskan di bagian
berikutnya).
Tidak seperti komponen lainnya, ada dua atribut izin terpisah
yang dapat Anda tetapkan untuk penyedia konten:
android:readPermission
membatasi aplikasi lain mana yang dapat membaca dari penyedia, dan
android:writePermission
membatasi
aplikasi lain mana yang dapat menulis ke penyedia. Perlu diketahui bahwa jika penyedia dilindungi dengan
izin baca dan tulis, memiliki izin tulis saja tidak
akan mengizinkan aplikasi membaca dari penyedia.
Izin diperiksa saat penyedia pertama kali diambil dan saat
aplikasi menjalankan operasi pada penyedia. Jika aplikasi yang meminta tidak memiliki
izin apa pun, SecurityException
akan terjadi. Penggunaan
ContentResolver.query()
memerlukan
izin baca; penggunaan
ContentResolver.insert()
,
ContentResolver.update()
, atau
ContentResolver.delete()
memerlukan izin tulis. Dalam semua kasus ini, tidak memegang izin yang diperlukan akan menghasilkan SecurityException
.
Memberikan akses per URI
Sistem ini memberi Anda kontrol tambahan yang terperinci tentang cara aplikasi lain
dapat mengakses penyedia konten aplikasi Anda. Secara khusus, penyedia konten Anda
dapat melindungi dirinya sendiri dengan izin baca dan tulis sekaligus tetap mengizinkan
klien langsungnya untuk berbagi URI tertentu dengan aplikasi lain. Untuk mendeklarasikan
dukungan aplikasi Anda terhadap model ini, gunakan
atribut android:grantUriPermissions
atau elemen
<grant-uri-permission>
.
Anda juga dapat memberikan izin per URI. Saat memulai
suatu aktivitas atau menampilkan hasil ke suatu aktivitas, tetapkan
flag intent
Intent.FLAG_GRANT_READ_URI_PERMISSION
,
flag intent Intent.FLAG_GRANT_WRITE_URI_PERMISSION
,
atau kedua flag tersebut. Tindakan ini memberikan izin baca, tulis, atau
baca/tulis kepada aplikasi lain untuk URI data yang disertakan
dalam intent. Aplikasi lain mendapatkan izin ini untuk URI tertentu, terlepas dari
apakah aplikasi tersebut memiliki izin untuk mengakses data di penyedia konten secara
lebih umum atau tidak.
Misalnya, anggaplah pengguna menggunakan aplikasi Anda untuk melihat email dengan
lampiran gambar. Aplikasi lain seharusnya tidak dapat mengakses konten email secara umum, tetapi aplikasi tersebut mungkin tertarik untuk melihat gambar.
Aplikasi Anda dapat menggunakan intent dan flag intent Intent.FLAG_GRANT_READ_URI_PERMISSION
untuk memungkinkan aplikasi yang melihat gambar melihat gambar.
Pertimbangan lainnya adalah visibilitas aplikasi. Jika aplikasi Anda menargetkan Android 11 (API level 30) atau yang lebih baru, sistem akan membuat beberapa aplikasi otomatis terlihat oleh aplikasi Anda dan menyembunyikan aplikasi lainnya secara default. Jika aplikasi Anda memiliki penyedia konten dan telah memberikan izin URI ke aplikasi lain, aplikasi Anda akan otomatis terlihat oleh aplikasi lain tersebut.
Untuk informasi selengkapnya, lihat materi referensi untuk
metode
grantUriPermission()
,
revokeUriPermission()
,
dan
checkUriPermission()
.
Membatasi interaksi dengan penerima siaran aplikasi Anda
Gunakan atribut android:permission
ke
tag
<receiver>
untuk membatasi aplikasi lain yang dapat mengirim
siaran ke BroadcastReceiver
terkait.
Izin
diperiksa setelah Context.sendBroadcast()
ditampilkan, karena sistem mencoba untuk mengirim siaran yang
dikirim ke penerima yang dituju. Ini berarti bahwa kegagalan
izin tidak menghasilkan pengecualian yang dikembalikan ke
pemanggil—melainkan hanya menyebabkan tidak dikirimkannya
Intent
.
Dengan cara yang sama, Anda dapat memberikan izin ke
Context.registerReceiver()
untuk mengontrol aplikasi lain yang dapat disiarkan ke
penerima yang terdaftar secara terprogram. Sebaliknya, Anda dapat memberikan izin
saat memanggil
Context.sendBroadcast()
untuk membatasi penerima siaran yang dapat 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.