Membatasi interaksi dengan aplikasi lain

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:

  1. Buka layar Info aplikasi di aplikasi.
  2. 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.