Dangerous Permission, uygulama çalışırken runtime diyalogu aracılığıyla kullanıcının açık rızasını gerektiren bir Android izin kategorisidir. Android Geliştirici Kılavuzu, 2024'e göre, tehlikeli izinler ProtectionLevel dangerous değerine sahiptir ve hassas verilere erişim sağlar: kamera, mikrofon, konum ve kişiler. Kullanıcının açık rızası olmadan uygulama bu özellikleri kullanamaz.
Ana Noktalar
Dangerous Permission, kullanıcının hassas verilerine erişim sağlayan bir Android sistem izinleri kategorisidir. Normal izinlerin aksine, tehlikeli izinler kurulum sırasında otomatik olarak verilmez — uygulamanın Android 6.0 Marshmallow (API 23) ile tanıtılan runtime mekanizması aracılığıyla çalışma zamanında bunları açıkça talep etmesi gerekir.
Açık istek ihtiyacı, bu izinlerin koruduğu verilerin doğasından kaynaklanır: kullanıcı konumu, kişisel kişiler, kamera ve mikrofon içeriği, arama geçmişi ve SMS. Android bu verileri hassas olarak değerlendirir ve kullanıcının bilinçli olarak erişim izni vermesini gerektirir. Android Privacy Sandbox (2024)'e göre, kullanıcılar ortalama olarak runtime isteklerinin yaklaşık yüzde 30'unu reddeder.
Dangerous Permission'ın temel bir özelliği, istediği zaman iptal edilebilmesidir. Kullanıcı Ayarlar — Uygulamalar — İzinler bölümüne giderek herhangi bir tehlikeli izni kapatabilir. Uygulama, daha önce verilmiş bir iznin yeniden başlatma olmaksızın herhangi bir zamanda iptal edilebileceğine hazırlıklı olmalıdır.
dangerous koruma seviyesi, OS düzeyindeki sistem izin tanımlarında belirlenir. Bir uygulama bu protectionLevel ile uses-permission bildirdiğinde, sistem izni runtime isteği gerektiren olarak işaretler. Normalin aksine, tehlikeli izinler her zaman sistem izin yönetimi arayüzünde görüntülenir ve iptal edilebilir.
Tüm tehlikeli izinler, işlevsel kategoriye göre Permission Groups içinde gruplandırılır. Örneğin, CAMERA ve CAMERA2 CAMERA grubunda, ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION LOCATION grubundadır. Kullanıcı bir gruptan bir izin verdiyse, aynı gruptaki kalan izinler ek diyalog olmadan otomatik olarak verilir.
Runtime isteği, uygulamanın bir izin istek diyalogu görüntülemek için sistem API'sini çağırdığı bir mekanizmadır. Kullanıcı, izin adı ve İzin Ver ile Reddet butonlarını içeren bir modal pencere görür. Yanıttan sonra sistem, sonuçla birlikte onRequestPermissionsResult geri çağrısını çağırır.
Tam döngü üç adım içerir: checkSelfPermission ile durum kontrolü, izin verilmemişse requestPermissions çağrısı ve onRequestPermissionsResult içinde sonucun işlenmesi. Durum kontrolü zorunludur çünkü kullanıcı ayarlar aracılığıyla izni herhangi bir zamanda iptal etmiş olabilir ve kontrol etmeden bir işlevi çağırmak SecurityException ile sonuçlanır.
fun checkAndRequestCameraPermission() {
when {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
openCamera()
}
else -> {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.CAMERA),
REQUEST_CAMERA_CODE
)
}
}
}
Sonuç işleme, ActivityResultLauncher veya onRequestPermissionsResult içinde gerçekleşir. Önerilen modern yaklaşım, açık istek kodları olmadan daha temiz bir API sağlayan ActivityResultContracts.RequestPermission kullanmaktır. Bu sözleşme bir Boolean döndürür — iznin verilip verilmediği.
Tehlikeli izinleri, uygulama başlangıcında değil, kesinlikle özelliğin kullanımı bağlamında isteyin. Kullanıcı kamera düğmesine bastıysa — CAMERA isteyin. Bir harita açtıysa — LOCATION isteyin. Bağlamsal istekler, ilk başlatmada tüm izinleri istemekten iki kat daha fazla izin verilmesi sağlar. Kullanıcının hangi özelliğin erişim gerektirdiğini anlaması için aynı anda birden fazla izin istenmemesi de önerilir.
Android, her biri bir veya daha fazla sabit içeren birkaç tehlikeli izin grubu tanımlar. En kapsamlı liste Manifest.permission sınıfında mevcuttur. Aşağıda geliştirmede kullanılan ana gruplar ve izinler verilmiştir.
| İzin Grubu | İzinler | API Erişimi |
|---|---|---|
| CAMERA | CAMERA | Camera API, CameraX |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION | FusedLocationProvider, Geofence |
| MICROPHONE | RECORD_AUDIO | MediaRecorder, AudioRecord |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG | TelephonyManager |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | ContactsContract |
| SMS | READ_SMS, SEND_SMS, RECEIVE_SMS | SmsManager |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE | MediaStore, File API |
| CALENDAR | READ_CALENDAR, WRITE_CALENDAR | CalendarContract |
Android 12'den başlayarak Google, bazı izinler için gereksinimleri sıkılaştırdı. Örneğin, BLUETOOTH_CONNECT ve BLUETOOTH_SCAN tehlikeli hale geldi ve runtime isteği gerektiriyor. Sensörlere arka plan erişimi için BODY_SENSORS_BACKGROUND izni de eklendi. Geliştiricilerin targetSdkVersion'u güncellemesi ve istekleri mevcut OS sürümlerinde test etmesi gerekir.
Android 13 (API 33), bildirimler (POST_NOTIFICATIONS) ve medya dosyaları (READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO) için yeni izinler getirerek genel READ_EXTERNAL_STORAGE'ın yerini aldı. Artık fotoğraflara, videolara ve sese erişim, tek bir diyalog olmadan uzmanlaşmış izinler aracılığıyla ayrı ayrı talep edilir.
Dangerous ve Normal Permission, verme şekli, iptal edilebilirlik ve UX açısından temelde farklılık gösterir. Normal kurulum sırasında otomatik olarak verilir, Dangerous açık bir runtime diyalogu gerektirir. Normal ayarlar aracılığıyla iptal edilemez, Dangerous istediği zaman devre dışı bırakılabilir. Bu asimetri farklı geliştirme desenleri oluşturur.
Kod açısından bakıldığında, tehlikeli izinler daha fazla iş gerektirir: checkSelfPermission, requestPermissions, reddetme işleme. Normal izinler için AndroidManifest.xml'de bir satır yeterlidir. Bununla birlikte, Dangerous Permission kullanıcıya kontrol verir, bu da özellikle kamera veya konum gibi hassas özellikler için güveni artırır.
Kategoriler arasındaki seçim geliştiriciye ait değildir — sistem tarafından belirlenir. Geliştirici yalnızca uses-permission bildirir ve sistem protectionLevel'a göre kategoriyi belirler. Ancak, tehlikeli izinleri isteme stratejisi kullanıcı deneyimini etkiler: sık veya uygunsuz diyaloglar uygulamanın puanını düşürür.
Modern yol Kotlin'de izin istemek için ActivityResultContracts.RequestMultiplePermissions veya RequestPermission kullanmaktır. Bu sözleşmeler androidx.activity kitaplığının bir parçasıdır ve onRequestPermissionsResult'u geçersiz kılmaya gerek kalmadan lambda tabanlı temiz bir API sağlar.
class CameraActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
openCamera()
} else {
showPermissionDeniedMessage()
}
}
fun requestCamera() {
when {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED ->
openCamera()
ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.CAMERA
) ->
showRationaleDialog()
else ->
requestPermissionLauncher.launch(
Manifest.permission.CAMERA
)
}
}
}
Bir uygulamanın aynı anda birden fazla tehlikeli izne ihtiyacı olduğunda, RequestMultiplePermissions kullanın. Sözleşme, anahtarın izin adı ve değerin sonuç olduğu Map<String, Boolean> döndürür. Bu, video kaydı için CAMERA ve RECORD_AUDIO istemeniz gereken ilk başlatmada kullanışlıdır.
Kullanıcı isteği reddederse, shouldShowRequestPermissionRationale yöntemi true döndürür. Bu, iznin neden gerekli olduğuna dair bir açıklama gösterilmesi gerektiğini belirtir. En iyi uygulama, bir açıklama ve Tekrar Dene butonu içeren özel bir diyalog göstermektir. Kullanıcı, Never Ask Again onay kutusunu işaretleyerek isteği tekrar reddederse, shouldShowRequestPermissionRationale false döndürecek ve Ayarlar'a yönlendirmeniz gerekir.
Never Ask Again, kullanıcının runtime diyalogunu ikinci kez reddederken ayarlayabileceği bir işarettir. Bundan sonra, bu izin için standart diyalog artık gösterilmez. Erişim izni vermenin tek yolu, kullanıcıyı sistem uygulama ayarlarına yönlendirmektir.
Geliştiricinin iki reddetme senaryosunu ayırt etmesi gerekir: birincisi, shouldShowRequestPermissionRationale true döndürdüğünde (kullanıcı reddetti ancak diyalog hâlâ gösterilebilir) ve ikincisi, yöntem false döndürdüğünde (Never Ask Again etkin veya izin politika tarafından engellenmiş). İkinci durumda, Ayarları Aç butonu göstermelisiniz.
fun handlePermissionDenied(permission: String) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this, permission
)) {
showRationaleDialog(permission)
} else {
showSettingsRedirectDialog(permission)
}
}
private fun showSettingsRedirectDialog(permission: String) {
AlertDialog.Builder(this)
.setTitle("Erişim reddedildi")
.setMessage(
"İzin engellendi. Ayarları açın."
)
.setPositiveButton("Ayarlar") { _, _ ->
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts(
"package", packageName, null
)
)
startActivity(intent)
}
.show()
}
shouldShowRequestPermissionRationale false döndürdüyse izni tekrar istememek önemlidir. Bu durumda requestPermissions için tekrarlanan bir çağrı diyalog göstermez — sonuç açıklama olmadan hemen DENIED ile döner. Kullanıcı net olmayan bir davranışla karşılaşır ve bu, uygulama deneyimini olumsuz etkiler.
Sıkça Sorulan Sorular
Tehlikeli izinler, ProtectionLevel dangerous değerine sahip izinleri içerir: CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION, READ_CONTACTS, READ_SMS, READ_CALENDAR ve diğerleri. Tam liste Manifest.permission sınıfında mevcuttur.
ContextCompat.checkSelfPermission kullanarak bağlamı ve izin adını iletin. Yöntem PERMISSION_GRANTED veya PERMISSION_DENIED döndürür. Kontrol, tehlikeli bir izin gerektiren her API çağrısından önce yapılmalıdır.
Permission Group, ilgili tehlikeli izinleri gruplandırır. Kullanıcı bir gruptan bir izin verirse, diğerleri otomatik olarak verilir. Örneğin, LOCATION, ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION'ı içerir.
Reddetmeden sonra shouldShowRequestPermissionRationale kontrol edin. Yöntem false döndürürse ve izin hâlâ verilmemişse — Never Ask Again etkindir. Kullanıcıyı ACTION_APPLICATION_DETAILS_SETTINGS ile Intent aracılığıyla Ayarlar'a yönlendirin.
Evet, zorunlu olmaya devam ediyorlar. Android 13+'da bazı izinler değişti: POST_NOTIFICATIONS ayrı bir runtime izni haline geldi ve READ_EXTERNAL_STORAGE, medya dosyalarına ayrıntılı erişim için READ_MEDIA_IMAGES ile değiştirildi.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun