Izin & Permintaan Saat Runtime
Deklarasikan dan minta izin berbahaya saat runtime menggunakan ActivityResultContracts, tampilkan dialog alasan, dan tangani penolakan permanen.
Izin & Permintaan Saat Runtime adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 7 dari 7. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 7 pelajaran total.
Ringkasan Izin Android
Aplikasi Android harus menyatakan fitur perangkat yang diperlukan. Izin melindungi privasi pengguna:
- Izin normal — berisiko rendah, diberikan secara otomatis (INTERNET, VIBRATE)
- Izin berbahaya — mengakses data sensitif, harus diminta saat runtime (CAMERA, LOCATION, READ_CONTACTS)
- Izin tanda tangan — hanya untuk aplikasi yang ditandatangani dengan sertifikat yang sama
Mendeklarasikan di Manifest
Semua izin harus dideklarasikan terlebih dahulu di AndroidManifest.xml:
<!-- AndroidManifest.xml -->
<manifest ...>
<!-- Normal: granted automatically -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- Dangerous: must request at runtime -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application ...>
...
</application>
</manifest>Memeriksa Apakah Izin Diberikan
Sebelum menggunakan fitur berbahaya, selalu periksa apakah izin tersebut sudah diberikan:
import androidx.core.content.ContextCompat
import android.content.pm.PackageManager
fun isCameraPermissionGranted(): Boolean {
return ContextCompat.checkSelfPermission(
this, // Context
android.Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
}Meminta Izin dengan ActivityResultLauncher
Gunakan ActivityResultContracts.RequestPermission() — cara modern (tanpa onRequestPermissionsResult yang sudah tidak digunakan):
class CameraActivity : AppCompatActivity() {
private val requestCameraPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
openCamera()
} else {
showPermissionDeniedMessage()
}
}
fun onTakePhotoClick(view: View) {
if (isCameraPermissionGranted()) {
openCamera()
} else {
requestCameraPermission.launch(android.Manifest.permission.CAMERA)
}
}
}Beberapa Izin Sekaligus
Minta beberapa izin dengan RequestMultiplePermissions:
private val requestMultiple = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
val cameraGranted = permissions[android.Manifest.permission.CAMERA] ?: false
val locationGranted = permissions[android.Manifest.permission.ACCESS_FINE_LOCATION] ?: false
if (cameraGranted && locationGranted) {
startFeature()
} else {
showWhichPermissionsDenied(cameraGranted, locationGranted)
}
}
fun requestPermissions() {
requestMultiple.launch(arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.ACCESS_FINE_LOCATION
))
}Alasan: Kapan Harus Menjelaskan
shouldShowRequestPermissionRationale() mengembalikan true ketika pengguna sebelumnya menolak izin tersebut. Tampilkan penjelasan sebelum memintanya lagi:
fun requestCameraWithRationale() {
when {
isCameraPermissionGranted() -> {
openCamera()
}
shouldShowRequestPermissionRationale(android.Manifest.permission.CAMERA) -> {
// Explain why we need it, then request
AlertDialog.Builder(this)
.setTitle("Camera needed")
.setMessage("We use the camera to take profile photos.")
.setPositiveButton("OK") { _, _ ->
requestCameraPermission.launch(android.Manifest.permission.CAMERA)
}
.show()
}
else -> {
requestCameraPermission.launch(android.Manifest.permission.CAMERA)
}
}
}Ditolak Permanen — Arahkan ke Setelan
Jika pengguna mengetuk "Jangan tanyakan lagi", shouldShowRequestPermissionRationale mengembalikan false dan Anda tidak dapat memintanya lagi. Arahkan pengguna ke setelan aplikasi:
fun openAppSettings() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}Izin Lokasi
Lokasi memiliki dua tingkat — pilih yang tepat sesuai kebutuhan Anda:
ACCESS_COARSE_LOCATION— akurasi tingkat kota (WiFi/menara seluler)ACCESS_FINE_LOCATION— akurasi GPSACCESS_BACKGROUND_LOCATION— diperlukan secara terpisah pada Android 10+ untuk mengakses lokasi di latar belakang
Contoh Lengkap Izin Kamera
Alur lengkap yang menggabungkan pemeriksaan → alasan → permintaan:
class PhotoActivity : AppCompatActivity() {
private val cameraLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) openCamera() else showDenied()
}
private fun handleCameraClick() {
val permission = android.Manifest.permission.CAMERA
when {
ContextCompat.checkSelfPermission(this, permission) ==
PackageManager.PERMISSION_GRANTED -> openCamera()
shouldShowRequestPermissionRationale(permission) ->
showRationaleDialog()
else -> cameraLauncher.launch(permission)
}
}
private fun showDenied() {
Snackbar.make(binding.root, "Camera permission required", Snackbar.LENGTH_LONG)
.setAction("Settings") { openAppSettings() }.show()
}
}Praktik Terbaik untuk Izin
Aturan utama untuk pengalaman pemberian izin yang lancar:
- Minta izin hanya saat diperlukan (bukan saat aplikasi dimulai)
- Minta hanya izin minimum yang diperlukan
- Selalu tangani penolakan dengan baik
- Jangan berulang kali meminta setelah pengguna memilih "Jangan tanyakan lagi"
- Jelaskan alasannya sebelum dialog sistem ditampilkan, bukan setelah penolakan
Izin Media Terperinci Android 13+
Sejak Android 13 (API 33), READ_EXTERNAL_STORAGE dipecah menjadi izin yang lebih terperinci:
READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
Selalu periksa Build.VERSION.SDK_INT dan minta izin yang tepat sesuai versi OS.
Pemeriksaan Singkat
Kapan Anda harus menampilkan dialog alasan sebelum meminta izin berbahaya?
Ringkasan: Izin
Izin saat runtime yang diterapkan dengan benar:
- Deklarasikan di
AndroidManifest.xml - Periksa dengan
ContextCompat.checkSelfPermission() - Minta melalui
registerForActivityResult(RequestPermission()) - Tampilkan alasan ketika
shouldShowRequestPermissionRationale()bernilai true - Untuk penolakan permanen, arahkan pengguna ke Setelan
- Jangan pernah meminta izin sebelum pengguna membutuhkannya
Berikutnya: simpan data secara lokal dengan DataStore.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Izin & Permintaan Saat Runtime” gratis?
Ya — teks lengkap “Izin & Permintaan Saat Runtime” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 7 pelajaran total.
Apa yang akan aku pelajari di “Izin & Permintaan Saat Runtime”?
Deklarasikan dan minta izin berbahaya saat runtime menggunakan ActivityResultContracts, tampilkan dialog alasan, dan tangani penolakan permanen. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 7 dari 7.
Berapa lama pelajaran “Izin & Permintaan Saat Runtime” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Struktur Proyek & Manifest
- Activity & Siklus Hidup
- Tata Letak & Tampilan
- Menangani Masukan Pengguna
- Intent & Navigasi
- Fragment
- Izin & Permintaan Saat Runtime