İzinler ve Çalışma Zamanı İstekleri
ActivityResultContracts kullanarak tehlikeli izinleri çalışma zamanında bildirin ve isteyin, gerekçe iletişim kutuları gösterin ve kalıcı reddetme durumunu ele alın.
İzinler ve Çalışma Zamanı İstekleri, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 7 dersinin 7. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 7 dersten oluşur.
Android İzinlerine Genel Bakış
Android uygulamaları, ihtiyaç duydukları cihaz özelliklerini bildirmelidir. İzinler, kullanıcı gizliliğini korur:
- Normal izinler — düşük risklidir ve otomatik olarak verilir (INTERNET, VIBRATE)
- Tehlikeli izinler — hassas verilere erişir ve çalışma zamanında istenmelidir (CAMERA, LOCATION, READ_CONTACTS)
- İmza izinleri — yalnızca aynı sertifikayla imzalanmış uygulamalar içindir
Manifest'te Bildirme
Tüm izinler önce AndroidManifest.xml içinde bildirilmelidir:
<!-- 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>İzin Verilip Verilmediğini Denetleme
Tehlikeli bir özelliği kullanmadan önce iznin zaten verilip verilmediğini her zaman denetleyin:
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
}ActivityResultLauncher ile İzin İsteme
ActivityResultContracts.RequestPermission() kullanın — modern yöntem budur (kullanımdan kaldırılan onRequestPermissionsResult yoktur):
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)
}
}
}Aynı Anda Birden Çok İzin
RequestMultiplePermissions ile birden çok izin isteyin:
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
))
}Gerekçe: Ne Zaman Açıklama Yapılmalı
shouldShowRequestPermissionRationale(), kullanıcı izni daha önce reddettiğinde true döndürür. Yeniden istemeden önce açıklama gösterin:
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)
}
}
}Kalıcı Olarak Reddedildi — Ayarlara Yönlendirme
Kullanıcı "Bir daha sorma" seçeneğine dokunursa shouldShowRequestPermissionRationale false döndürür ve artık yeniden istekte bulunamazsınız. Kullanıcıyı uygulama ayarlarına yönlendirin:
fun openAppSettings() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}Konum İzni
Konum için iki düzey vardır — kullanım amacınıza uygun olanı seçin:
ACCESS_COARSE_LOCATION— şehir düzeyinde doğruluk (WiFi/hücresel baz istasyonları)ACCESS_FINE_LOCATION— GPS doğruluğuACCESS_BACKGROUND_LOCATION— arka planda konuma erişmek için Android 10 ve sonraki sürümlerde ayrıca gereklidir
Kamera İzni: Tam Örnek
Denetleme → gerekçe → isteme adımlarını birleştiren eksiksiz akış:
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()
}
}İzinler İçin En İyi Uygulamalar
Sorunsuz bir izin deneyimi için temel kurallar:
- İzinleri yalnızca gerektiğinde isteyin (uygulama açılışında değil)
- Yalnızca gerekli en az izinleri isteyin
- İzin reddedildiğinde durumu her zaman uygun şekilde yönetin
- "Bir daha sorma" seçeneğinden sonra tekrar tekrar istemeyin
- Neden gerektiğini sistem iletişim kutusundan önce açıklayın, ret sonrasında değil
Android 13 ve Sonrasında Ayrıntılı Medya İzinleri
Android 13'ten (API 33) itibaren READ_EXTERNAL_STORAGE, ayrıntılı izinlere ayrılmıştır:
READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
Her zaman Build.VERSION.SDK_INT değerini denetleyin ve OS sürümüne uygun izni isteyin.
Hızlı Kontrol
Tehlikeli bir izin istemeden önce ne zaman gerekçe iletişim kutusu göstermelisiniz?
Özet: İzinler
Çalışma zamanı izinlerini doğru kullanma:
AndroidManifest.xmliçinde bildirinContextCompat.checkSelfPermission()ile denetleyinregisterForActivityResult(RequestPermission())aracılığıyla isteyinshouldShowRequestPermissionRationale()true olduğunda gerekçe gösterin- Kalıcı ret durumunda kullanıcıları Settings'e yönlendirin
- Kullanıcının ihtiyacı oluşmadan önce asla izin istemeyin
Sonraki konu: verileri DataStore ile yerel olarak kaydetme.
Sıkça Sorulan Sorular
“İzinler ve Çalışma Zamanı İstekleri” dersi ücretsiz mi?
Evet — “İzinler ve Çalışma Zamanı İstekleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 7 dersten oluşur.
“İzinler ve Çalışma Zamanı İstekleri” dersinde ne öğreneceğim?
ActivityResultContracts kullanarak tehlikeli izinleri çalışma zamanında bildirin ve isteyin, gerekçe iletişim kutuları gösterin ve kalıcı reddetme durumunu ele alın. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Android Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 7 dersinin 7. dersidir.
“İzinler ve Çalışma Zamanı İstekleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Proje Yapısı ve Manifest
- Activity'ler ve Yaşam Döngüsü
- Düzenler ve Görünümler
- Kullanıcı Girdisini Ele Alma
- Intent'ler ve Gezinme
- Fragment'ler
- İzinler ve Çalışma Zamanı İstekleri