AndroidManifest Permissions: konsep kunci, deklarasi dan tipe izin

Penulis: IT Sectr Diterbitkan: 2026-05-21 Waktu membaca: 10 mnt

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.xml — file manifes dengan deklarasi semua izin aplikasi
  • Tingkat perlindungan — normal, dangerous, signature, special dengan mekanisme permintaan berbeda
  • Runtime Permission — izin dangerous memerlukan permintaan saat runtime (Android 6+)
  • Declare vs Request — deklarasi dalam manifes wajib, tetapi dangerous memerlukan permintaan tambahan dalam kode
  • Grup — izin dikelompokkan dalam grup, persetujuan satu memberi akses ke seluruh grup

Apa itu AndroidManifest Permissions?

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.

Perbedaan dari model izin iOS

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.

Evolusi izin berdasarkan versi Android

Versi AndroidPerubahan dalam model izin
Android 1.0–5.xSemua 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)

Jenis izin apa saja yang ada

Android mendefinisikan empat tingkat perlindungan (protection levels) untuk izin, masing-masing dengan aturan pemberian sendiri. Mari kita bahas setiap tingkat secara detail.

Normal Permissions (install-time)

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.

Dangerous Permissions (runtime)

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.

Signature dan Special Permissions

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.

Runtime Permission: bekerja dengan izin dangerous

Mulai Android 6.0, semua izin dangerous memerlukan permintaan saat runtime. Mari kita lihat siklus kerja lengkap dengan runtime permissions di Kotlin.

Memeriksa dan meminta izin

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.

kotlin
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
                )
            }
        }
    }
}

Menangani penolakan “Don’t ask again”

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”.

kotlin
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()
}

Deklarasi izin di AndroidManifest.xml

File AndroidManifest.xml berisi elemen <uses-permission> untuk setiap izin yang digunakan aplikasi. Izin dideklarasikan di tingkat <manifest> sebelum elemen <application>.

Sintaks deklarasi

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.

xml
<!-- 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>

Menggunakan <uses-feature> untuk pemfilteran

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).

Praktik terbaik dan kesalahan

Bekerja dengan benar dengan izin adalah aspek kunci kualitas aplikasi Android. Mari kita lihat rekomendasi utama dan kesalahan umum.

Meminimalkan izin yang diminta

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.

Menampilkan rationale sebelum permintaan

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.

Menguji semua skenario izin

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.

Kesalahan umum

  • Meminta izin tanpa pemeriksaan checkSelfPermission sebelumnya — menyebabkan dialog yang tidak perlu
  • Mengabaikan shouldShowRequestPermissionRationale — memperburuk UX setelah penolakan pertama
  • Meminta izin tanpa konteks (hanya “Izinkan akses?”) — mengurangi persetujuan
  • Menggunakan WRITE_EXTERNAL_STORAGE di Android 10+ tanpa maxSdkVersion — permintaan yang tidak perlu
  • Tidak memeriksa izin di onResume — melewatkan pencabutan izin di pengaturan

Pertanyaan yang sering diajukan

Apakah saya perlu mendeklarasikan izin jika diminta oleh SDK?

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.

Apa yang terjadi jika saya tidak menangani penolakan izin?

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.

Bagaimana cara mereset izin selama pengembangan?

Di pengaturan perangkat: Pengaturan → Aplikasi → [aplikasi Anda] → Izin. Untuk mereset semua izin, gunakan perintah adb: adb shell pm reset-permissions.

Bisakah saya meminta izin tanpa Activity?

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.

Mengapa maxSdkVersion diperlukan untuk izin?

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

  • AndroidManifest Permissions — deklarasi wajib akses ke sumber daya sistem di Android
  • 4 tingkat perlindungan — normal, dangerous, signature, special dengan mekanisme pemberian berbeda
  • Runtime Permissions — izin dangerous memerlukan permintaan saat runtime (Android 6+)
  • Grup izin — persetujuan satu izin dalam grup memberi akses ke semua di grup
  • Rationale — menampilkan penjelasan sebelum permintaan meningkatkan persetujuan 20–30%
  • Minimasi — hanya minta izin yang diperlukan dan gunakan maxSdkVersion
  • Selalu periksa status izin sebelum memanggil API dan tangani semua skenario penolakan

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.

Diskusikan proyek

Baca juga