Çalışma zamanı izinlerini isteme ve reddetmeyi yönetme
İlk 200 karakterde: İzni ContextCompat.checkSelfPermission ile kontrol edin, ActivityResultLauncher (veya ActivityCompat.requestPermissions) aracılığıyla isteyin, gerektiğinde gerekçelendirme gösterin ve kalıcı reddetme durumunda kullanıcıyı Settings.ACTION_APPLICATION_DETAILS_SETTINGS üzerinden ayarlara yönlendirin.
İzin istemenin kısa ve pratik yolu
- AndroidManifest.xml dosyasına izni ekleyin:
<uses-permission android:name="android.permission.CAMERA" />
- İşlem öncesinde mevcut durumu kontrol edin:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// izin istenmeli
}
- Eskimiş onRequestPermissionsResult yerine Activity Result API'yi kullanın (önerilir):
private val requestCameraLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) openCamera() else handleCameraDenied()
}
// İstek
requestCameraLauncher.launch(Manifest.permission.CAMERA)
- Birden fazla izin gerekiyorsa (kamera + ses kaydı), ActivityResultContracts.RequestMultiplePermissions kullanın.
Zorunlu UX: Gerekçelendirme ve reddetme yönetimi
- İşlem açık değilse, isteği yapmadan önce kullanıcıya kısa bir açıklama (gerekçelendirme) gösterin: "Profil fotoğrafı için kamera gerekli".
İzni, uygulamanın başlangıcında değil, kullanıcının eylemi bağlamında (tembel istek) isteyin: örneğin "Fotoğraf çek" düğmesine tıklandığında.
- Reddedildikten sonra shouldShowRequestPermissionRationale() yöntemini kontrol edin:
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// açıklamalı bir iletişim kutusu gösterip isteği tekrarlayın
} else {
// muhtemelen "Bir daha sorma" işaretlenmiş — ayarları açmayı önerin
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
- İşlev kritik değilse, onu devre dışı bırakın ve kullanıcıya alternatif sunun ("İzin olmadan fotoğraf kullanılamaz").
onRequestPermissionsResult içinde grantResults kontrolü yapmadan güvenmeyin; bu sık karşılaşılan bir hata nedenidir. Daha basit ve güvenilir olan Activity Result API'yi kullanın.
Pratik öneriler ve senaryolar
- İstek setini minimize edin: yalnızca şu anda gerekeni isteyin.
- Mantıklı şekilde gruplayın (video için kamera + mikrofon).
- Farklı Android sürümlerinde test edin: davranış ve izin setleri değişir (örneğin, Android 11+ — Scoped Storage; Android 13 — bildirimlerin ayrıştırılması).
- Özel izinler (SYSTEM_ALERT_WINDOW, MANAGE_EXTERNAL_STORAGE) için kullanıcıyı sistem ayarlarına yönlendirin; bunlar normal iletişim kutusuyla istenmez.
Reddetme yönetimine yönelik yaklaşımların karşılaştırması
| Senaryo | Öneri | Neden |
|---|---|---|
| İlk reddetme | Gerekçelendirme gösterip isteği tekrarlayın | Açıklamadan sonra yaklaşık %40'ı kararını değiştiriyor |
| "Bir daha sorma" işaretlendi | Uygulama ayarlarını açmayı önerin | Kullanıcının izni geri vermesinin tek yolu |
| Kısmi onay (birden fazla izin) | Tüm grantResults değerlerini kontrol edin | NPE ve hatalı mantıktan kaçınırsınız |
Sık yapılan hatalar
- Uygulama başlangıcında açıklama yapmadan izin istemek.
- shouldShowRequestPermissionRationale() yöntemini görmezden gelmek.
- Çoklu izinlerde olası tüm grantResults değerlerini işlememek.
- Eski API'leri Activity Result API yerine kullanmak.
SSS
- İzni hem manifestte belirtmek hem de çalışma zamanında istemek gerekir mi?
- Evet. Tehlikeli izinler için hem manifestte beyan hem de çalışma zamanı isteği gereklidir.
- Kullanıcı sürekli reddederse ne yapılmalı?
- İşlevselliği anlaşılır bir açıklama ile devre dışı bırakın ve alternatifler veya ayarlara gitme yolu sunun.
- İstekler nasıl test edilir?
- Emülatörlerde ve gerçek cihazlarda; ADB ile izinler verilebilir/geri alınabilir: adb shell pm grant|revoke
.
- Emülatörlerde ve gerçek cihazlarda; ADB ile izinler verilebilir/geri alınabilir: adb shell pm grant|revoke
Bu kurallara uyarak reddetme sayısını azaltır, çökme ve hatalardan kaçınır, uygulamanızın davranışını kullanıcı dostu ve öngörülebilir hale getirirsiniz.