AndroidManifest Permissions adalah deklarasi izin dalam file AndroidManifest.xml yang menentukan sumber daya dan data sistem apa yang dapat diakses aplikasi. Android mengharuskan setiap izin dicantumkan dalam manifes sebelum menggunakan API yang sesuai: dari kamera dan geolokasi hingga mengirim SMS dan mengakses kontak. Menurut Android Developer Documentation, setiap izin dibagi menjadi salah satu dari empat tingkat perlindungan: normal, dangerous, signature, dan special.
Poin utama
AndroidManifest Permissions adalah mekanisme keamanan Android yang mengontrol akses aplikasi ke data yang dilindungi dan fungsi sistem. Setiap aplikasi harus mendeklarasikan izin yang diperlukan dalam file AndroidManifest.xml menggunakan elemen <uses-permission>. Tanpa deklarasi, pemanggilan API yang sesuai akan gagal dengan kesalahan keamanan SecurityException.
Model izin Android telah melalui beberapa tahap evolusi. Sebelum Android 6.0 (API 23), semua izin diberikan saat instalasi — pengguna melihat daftar lengkap dan menyetujui atau menolak instalasi aplikasi. Mulai Android 6.0, izin tingkat dangerous diminta saat runtime (Runtime Permissions), yang memberikan kontrol lebih fleksibel kepada pengguna.
Izin dibagi menjadi empat tingkat perlindungan: normal (diberikan otomatis saat instalasi), dangerous (memerlukan permintaan runtime), signature (hanya tersedia untuk aplikasi yang ditandatangani dengan sertifikat yang sama) dan special (memerlukan aktivasi terpisah di pengaturan). Setiap tingkat memiliki mekanisme pemberian dan pencabutan sendiri.
Menurut Google I/O 2024, Android 15 direncanakan akan memperkenalkan izin yang lebih granular — pengguna dapat memberikan akses hanya ke file tertentu di perpustakaan media, bukan seluruh perpustakaan. Ini melanjutkan tren Android untuk meminimalkan volume data yang diberikan secara default.
Tidak seperti iOS di mana semua izin diminta saat runtime, Android membagi izin menjadi waktu instalasi (install-time) dan runtime. Tingkat normal diberikan otomatis saat instalasi tanpa pemberitahuan kepada pengguna. Tingkat dangerous memerlukan dialog eksplisit, seperti di iOS.
Perbedaan lain: di Android, izin dikelompokkan dalam grup (permission groups). Jika pengguna menyetujui akses ke kamera, aplikasi secara otomatis mendapatkan akses ke mikrofon — keduanya berada dalam grup MICROPHONE yang sama. Di iOS, setiap izin diminta secara terpisah, terlepas dari grup.
| Versi Android | Perubahan dalam model izin |
|---|---|
| Android 1.0–5.x | Semua izin diberikan saat instalasi (install-time) |
| Android 6.0 (API 23) | Pengenalan Runtime Permissions untuk tingkat dangerous |
| Android 10 (API 29) | Scoped Storage — akses terbatas ke sistem file |
| Android 11 (API 30) | Reset otomatis izin — izin yang tidak digunakan direset |
| Android 14 (API 34) | Izin Runtime untuk akses media (foto, video, audio) |
Android mendefinisikan empat tingkat perlindungan (protection levels) untuk izin, masing-masing dengan aturan pemberian sendiri. Mari kita bahas setiap tingkat secara detail.
Izin normal diberikan secara otomatis saat instalasi aplikasi tanpa pemberitahuan atau permintaan kepada pengguna. Izin ini mencakup akses ke fungsi berisiko rendah yang tidak mengancam privasi pengguna: INTERNET, ACCESS_NETWORK_STATE, VIBRATE, BLUETOOTH. Pengguna tidak melihat dialog persetujuan — izin dianggap diberikan dengan fakta instalasi.
Pengembang tidak perlu menangani permintaan dalam kode untuk izin normal — cukup mendeklarasikannya di manifes. Namun, di Android 12+ saat instalasi dari Google Play, pengguna melihat tab “Izin” dengan daftar semua izin normal, yang meningkatkan transparansi. Menurut Statista (2024), lebih dari 90% aplikasi di Google Play menggunakan INTERNET sebagai izin normal yang paling umum.
Izin dangerous mencakup akses ke data dan fungsi yang dapat melanggar privasi: kamera, mikrofon, geolokasi, kontak, SMS, telepon, kalender, sensor tubuh. Izin ini memerlukan mekanisme dua langkah: deklarasi di manifes + permintaan saat runtime melalui ActivityCompat.requestPermissions().
Pengguna dapat menolak memberikan izin dangerous, dan aplikasi harus menangani skenario ini dengan benar. Di Android 11+, jika pengguna menolak dua kali, permintaan berikutnya tidak menampilkan dialog sistem — sistem secara otomatis mengembalikan DENIED. Dalam hal ini, pengguna harus diarahkan ke pengaturan.
Tingkat signature — izin diberikan secara otomatis jika aplikasi ditandatangani dengan sertifikat yang sama dengan sistem atau aplikasi lain yang mendefinisikan izin. Digunakan untuk aplikasi sistem dan perusahaan. Contoh: BIND_ACCESSIBILITY_SERVICE — hanya tersedia untuk aplikasi sistem.
Tingkat special (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, REQUEST_INSTALL_PACKAGES, MANAGE_EXTERNAL_STORAGE) — memerlukan tindakan terpisah dari pengguna melalui pengaturan sistem. Aplikasi dapat membuka halaman pengaturan dengan Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION). Google Play membatasi penggunaan izin special dan memerlukan justifikasi dalam formulir saat publikasi.
Mulai Android 6.0, semua izin dangerous memerlukan permintaan saat runtime. Mari kita lihat siklus kerja lengkap dengan runtime permissions di Kotlin.
Sebelum memanggil API yang memerlukan izin dangerous, selalu periksa status saat ini melalui ContextCompat.checkSelfPermission(). Jika statusnya PERMISSION_GRANTED — API dapat dipanggil. Jika PERMISSION_DENIED — izin harus diminta melalui ActivityResultContract RequestPermission (AndroidX) atau requestPermissions() yang sudah usang.
Disarankan menggunakan ActivityResultContracts.RequestMultiplePermissions untuk meminta beberapa izin secara bersamaan. Google merekomendasikan mengelompokkan izin terkait (misalnya kamera + mikrofon untuk perekaman video) dalam satu dialog, sehingga pengguna melihat konteks permintaan secara lengkap.
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
class CameraActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
openCamera()
} else {
explainWhyPermissionNeeded()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkCameraPermission()
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
openCamera()
}
shouldShowRequestPermissionRationale(
Manifest.permission.CAMERA
) -> {
showRationale()
}
else -> {
requestPermissionLauncher.launch(
Manifest.permission.CAMERA
)
}
}
}
}
Jika pengguna menolak izin dua kali, Android mengalihkan permintaan ke status “Never ask again”. Dalam hal ini shouldShowRequestPermissionRationale() mengembalikan false, dan dialog sistem tidak akan ditampilkan. Aplikasi harus mengarahkan pengguna ke pengaturan sistem melalui Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).
Penting: jangan tampilkan dialog yang menawarkan untuk membuka pengaturan segera setelah penolakan pertama — ini dianggap sebagai perilaku agresif. Gunakan shouldShowRequestPermissionRationale() untuk menentukan apakah perlu menampilkan penjelasan. Material Design Guidelines merekomendasikan menampilkan layar dengan penjelasan nilai akses, bukan hanya tombol “Buka pengaturan”.
private fun openAppSettings() {
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)
).also { intent ->
startActivity(intent)
}
}
private fun showPermissionSettings() {
AlertDialog.Builder(this)
.setTitle("Akses ke kamera")
.setMessage("Izinkan akses kamera di Pengaturan, "
+ "untuk mengambil foto profil")
.setPositiveButton("Buka pengaturan") { _, _ ->
openAppSettings()
}
.setNegativeButton("Batal", null)
.show()
}
File AndroidManifest.xml berisi elemen <uses-permission> untuk setiap izin yang digunakan aplikasi. Izin dideklarasikan di tingkat <manifest> sebelum elemen <application>.
Setiap izin dideklarasikan sebagai elemen terpisah <uses-permission> dengan atribut android:name yang menunjukkan nama lengkap izin. Untuk izin yang muncul di versi Android tertentu, gunakan atribut maxSdkVersion untuk membatasi deklarasi hanya ke versi yang diperlukan — ini meningkatkan kompatibilitas.
Misalnya, izin WRITE_EXTERNAL_STORAGE tidak diperlukan di Android 10+ (Scoped Storage), jadi tentukan maxSdkVersion=“28” (Android 9). Ini mencegah pertanyaan yang tidak perlu dari pengguna di versi yang lebih baru. Android Studio memperingatkan tentang maxSdkVersion yang direkomendasikan melalui Lint.
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions (install-time) -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Dangerous permissions (runtime) -->
<uses-permission
android:name="android.permission.CAMERA" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Legacy storage permission limited to API 28 and below -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application>
<!-- ... -->
</application>
</manifest>
Elemen <uses-feature> menentukan bahwa aplikasi memerlukan perangkat keras tertentu (kamera, GPS, NFC). Atribut android:required=“false” memungkinkan instalasi aplikasi pada perangkat tanpa perangkat keras ini — pemeriksaan ketersediaan dilakukan dalam kode. Jika required=“true”, Google Play memfilter aplikasi dan aplikasi menjadi tidak tersedia untuk perangkat yang tidak sesuai.
Disarankan untuk semua fungsi perangkat keras menetapkan required=“false” dan memeriksa ketersediaan secara terprogram melalui PackageManager.hasSystemFeature(). Ini memperluas audiens aplikasi Anda. Satu-satunya pengecualian adalah ketika fungsi tersebut penting untuk pengoperasian aplikasi (aplikasi pemesanan taksi tanpa GPS tidak masuk akal).
Bekerja dengan benar dengan izin adalah aspek kunci kualitas aplikasi Android. Mari kita lihat rekomendasi utama dan kesalahan umum.
Hanya minta izin yang benar-benar diperlukan untuk pengoperasian aplikasi. Setiap izin tambahan mengurangi konversi pemasangan dan meningkatkan jumlah penolakan. Google Play Console menunjukkan berapa banyak pengguna yang membatalkan pemasangan karena kumpulan izin. Menurut AppBrain (2024), aplikasi dengan 10+ izin dangerous memiliki 35% lebih sedikit pemasangan.
Tinjau daftar izin secara teratur. Hapus yang tidak digunakan, terutama saat beralih ke versi Android yang lebih baru di mana beberapa izin menjadi opsional. Misalnya, dengan munculnya pemilih foto (ActivityResultContracts.PickVisualMedia) di Android 13+, akses ke perpustakaan media dapat diperoleh tanpa izin dangerous READ_MEDIA_IMAGES.
Sebelum meminta izin dangerous, tampilkan layar kepada pengguna dengan penjelasan mengapa izin ini diperlukan dan nilai apa yang diberikannya. Material Design merekomendasikan penggunaan bottom sheet atau dialog dengan ikon, teks singkat, dan tombol “Lanjutkan”. Rationale meningkatkan persetujuan sebesar 20–30% dibandingkan dengan permintaan langsung.
Periksa shouldShowRequestPermissionRationale() sebelum memanggil launch(). Jika true — tampilkan rationale. Jika false — izin sudah diberikan atau pengguna telah menolak secara permanen (never ask again). Dalam kasus terakhir, tampilkan tombol “Buka pengaturan”, jangan ulangi permintaan.
Uji semua kemungkinan skenario: pemberian izin, penolakan, penolakan permanen, pencabutan izin di pengaturan, pengaturan ulang izin (Android 11+ auto-reset). Setiap skenario harus ditangani tanpa crash dan tanpa kehilangan data. Android Testing Guide merekomendasikan penggunaan pustaka TestPermission untuk mengotomatiskan pengujian.
Berikan perhatian khusus pada skenario ketika pengguna mencabut izin saat aplikasi sedang berjalan (aplikasi diminimalkan → Pengaturan → pencabutan). Saat kembali ke aplikasi, periksa semua izin lagi melalui onResume(). Jangan mengandalkan caching status izin — pengguna dapat mengubahnya kapan saja.
Pertanyaan yang sering diajukan
Ya, jika SDK menyertakan izin dalam manifesnya, izin tersebut akan digabungkan dengan manifes aplikasi saat pembangunan. Anda dapat menonaktifkan izin SDK yang tidak perlu dengan tools:node=“remove” di AndroidManifest.xml.
Memanggil API tanpa izin akan menyebabkan SecurityException, yang mengakibatkan crash aplikasi. Selalu periksa status izin sebelum menggunakan API yang sesuai dan tangani penolakan dengan benar.
Di pengaturan perangkat: Pengaturan → Aplikasi → [aplikasi Anda] → Izin. Untuk mereset semua izin, gunakan perintah adb: adb shell pm reset-permissions.
Ya, dengan ActivityResultLauncher di Fragment atau Service. Namun, dialog permintaan selalu memerlukan konteks UI Activity. Untuk Service, Anda dapat menampilkan Notification dengan Intent yang membuka Activity dengan permintaan.
Misalnya, WRITE_EXTERNAL_STORAGE tidak diperlukan di Android 10+ (Scoped Storage). Dengan menentukan android:maxSdkVersion=“28”, Anda mengecualikan deklarasi izin di versi yang lebih baru, yang meningkatkan kompatibilitas dan mengurangi daftar izin yang diminta.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga