Çalışma zamanı izinlerini isteme ve reddetmeyi yönetme

Kerem Aydın·7 Temmuz 2026·⏱2 dk

İ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

  1. AndroidManifest.xml dosyasına izni ekleyin:
<uses-permission android:name="android.permission.CAMERA" />
  1. İşlem öncesinde mevcut durumu kontrol edin:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
    != PackageManager.PERMISSION_GRANTED) {
    // izin istenmeli
}
  1. 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)
  1. 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ÖneriNeden
İlk reddetmeGerekçelendirme gösterip isteği tekrarlayınAçıklamadan sonra yaklaşık %40'ı kararını değiştiriyor
"Bir daha sorma" işaretlendiUygulama ayarlarını açmayı önerinKullanıcının izni geri vermesinin tek yolu
Kısmi onay (birden fazla izin)Tüm grantResults değerlerini kontrol edinNPE 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 .

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.