Izin tidak hanya bertujuan untuk meminta fungsi sistem. Anda juga dapat membatasi cara aplikasi lain berinteraksi dengan komponen aplikasi Anda.
Panduan ini menjelaskan cara melihat 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. Terakhir, halaman ini memberikan panduan tentang beberapa cara lain untuk menerapkan pola interaksi antar-aplikasi.
Melihat 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.
Membatasi interaksi dengan aktivitas aplikasi Anda
Izin yang diterapkan menggunakan atribut android:permission
pada
tag
<activity>
di dalam manifes membatasi siapa 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
Izin yang diterapkan menggunakan atribut android:permission
pada tag
<service>
di dalam manifes membatasi siapa yang dapat memulai
atau melakukan binding ke Service
yang 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
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 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 muncul), dan saat Anda menjalankan operasi pada penyedia. 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
.
Mengizinkan 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 langsung penyedia 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 tanda intent
Intent.FLAG_GRANT_READ_URI_PERMISSION
, tanda intent Intent.FLAG_GRANT_WRITE_URI_PERMISSION
, atau kedua tanda tersebut. Tindakan ini memberikan izin baca, tulis, dan baca/tulis kepada aplikasi lain masing-masing 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.
Misalnya, anggap seorang pengguna sedang melihat email di aplikasi Anda dan email ini menyertakan gambar sebagai lampiran. Aplikasi lain seharusnya tidak dapat mengakses konten email secara umum, tetapi aplikasi tersebut mungkin tertarik untuk melihat gambar.
Aplikasi Anda dapat menggunakan intent dan tanda intent Intent.FLAG_GRANT_READ_URI_PERMISSION
agar aplikasi yang melihat gambar dapat 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, tetapi aplikasi lain akan disembunyikan secara default. Jika aplikasi Anda memiliki penyedia konten dan telah memberikan izin URI ke aplikasi lain, aplikasi Anda akan otomatis terlihat oleh aplikasi lain.
Untuk informasi selengkapnya, lihat materi referensi untuk metode grantUriPermission()
, revokeUriPermission()
, dan checkUriPermission()
.
Membatasi interaksi dengan penerima siaran aplikasi Anda
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
menyebabkan tidak dikirimkannya Intent
.
Dengan cara yang sama, sebuah izin dapat diberikan ke Context.registerReceiver()
untuk mengontrol siapa yang dapat melakukan siaran ke
penerima yang terdaftar secara terprogram. Sebaliknya, izin dapat
diberikan saat memanggil Context.sendBroadcast()
untuk membatasi penerima siaran
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.
Pemeriksaan izin lainnya
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()
.