AndroidManifest Permissions — AndroidManifest.xml faylında icazə bəyannamələridir ki, proqramın hansı sistem resurslarına və məlumatlara girişi olduğunu müəyyən edir. Android hər bir icazənin manfestdə göstərilməsini tələb edir: kameradan və geolokasiyadan SMS göndərməyə və kontaktlara girişə qədər. Android Developer Documentation-a görə hər bir icazə dörd qoruma səviyyəsindən birinə bölünür: normal, dangerous, signature və special.
Əsas məqamlar
AndroidManifest Permissions — Android-in proqramların qorunan məlumatlara və sistem funksiyalarına girişini idarə edən təhlükəsizlik mexanizmidir. Hər bir proqram AndroidManifest.xml faylında <uses-permission> elementi ilə lazımi icazələri bəyan etməlidir. Bəyannamə olmadan müvafiq API-nin çağırışı SecurityException təhlükəsizlik xətası ilə nəticələnəcək.
Android icazə modeli bir neçə təkamül mərhələsindən keçdi. Android 6.0 (API 23)-dən əvvəl bütün icazələr quraşdırma zamanı verilirdi — istifadəçi tam siyahını görür və razılaşır və ya quraşdırmadan imtina edirdi. Android 6.0-dan başlayaraq dangerous səviyyəli icazələr icra zamanı (Runtime Permissions) sorğulanır ki, bu da istifadəçiyə daha çevik nəzarət verir.
İcazələr dörd qoruma səviyyəsinə bölünür: normal (quraşdırma zamanı avtomatik verilir), dangerous (icra zamanı sorğu tələb edir), signature (eyni sertifikatla imzalanmış proqramlar üçün əlçatandır) və special (parametrlərdə ayrıca aktivləşdirmə tələb edir). Hər səviyyənin öz vermə və geri çağırma mexanizmi var.
Google I/O 2024-ə görə Android 15-də dənəvər icazələrin tətbiqi planlaşdırılır — istifadəçi media kitabxanasının hamısına deyil, yalnız müəyyən fayllarına giriş verə biləcək. Bu Android-in susmaya görə verilən məlumatların həcmini minimuma endirmək tendensiyasını davam etdirir.
iOS-dən fərqli olaraq, bütün icazələrin icra zamanı (runtime) sorğulandığı yerdə, Android icazələri quraşdırma (install-time) və icra (runtime) olaraq ayırır. Normal səviyyə quraşdırma zamanı istifadəçiyə bildiriş olmadan avtomatik verilir. Dangerous səviyyə iOS-da olduğu kimi aşkar dialoq tələb edir.
Digər fərq: Android-də icazələr qruplara (permission groups) birləşdirilib. İstifadəçi kameraya girişə razı olarsa, proqram avtomatik olaraq mikrofona giriş əldə edir — onlar eyni MICROPHONE qrupundadır. iOS-da hər icazə qrupdan asılı olmayaraq ayrıca sorğulanır.
| Android versiyası | İcazə modelində dəyişiklik |
|---|---|
| Android 1.0–5.x | Bütün icazələr quraşdırma zamanı verilir (install-time) |
| Android 6.0 (API 23) | Dangerous səviyyə üçün Runtime Permissions-in tətbiqi |
| Android 10 (API 29) | Scoped Storage — fayl sisteminə giriş məhdudlaşdırıldı |
| Android 11 (API 30) | İcazələrin avtomatik sıfırlanması — istifadə olunmayan icazələr sıfırlanır |
| Android 14 (API 34) | Media girişi üçün Runtime icazələri (foto, video, audio) |
Android icazələr üçün dörd qoruma səviyyəsi (protection levels) müəyyən edir, hər biri öz vermə qaydaları ilə. Hər səviyyəni ətraflı nəzərdən keçirək.
Normal icazələr proqramın quraşdırılması zamanı istifadəçiyə bildiriş və ya sorğu olmadan avtomatik verilir. Bunlar istifadəçinin məxfiliyinə təhlükə yaratmayan aşağı riskli funksiyalara girişi əhatə edir: INTERNET, ACCESS_NETWORK_STATE, VIBRATE, BLUETOOTH. İstifadəçi razılıq dialoqu görmür — icazə quraşdırma faktı ilə verilmiş sayılır.
Tərtibatçı normal icazələr üçün kodda sorğu emal etməlidir — onları manifestdə bəyan etmək kifayətdir. Lakin Android 12+-da Google Play-dən quraşdırma zamanı istifadəçi bütün normal icazələrin siyahısı ilə “İcazələr” sekmesini görür ki, bu da şəffaflığı artırır. Statista (2024)-yə görə Google Play-də proqramların 90%-dən çoxu ən geniş yayılmış normal icazə olan INTERNET-dən istifadə edir.
Dangerous icazələr məxfiliyi poza biləcək məlumatlara və funksiyalara girişi əhatə edir: kamera, mikrofon, geolokasiya, kontaktlar, SMS, telefon, təqvim, bədən sensorları. Bu icazələr iki mərhələli mexanizm tələb edir: manifestdə bəyannamə + ActivityCompat.requestPermissions() vasitəsilə icra zamanı sorğu.
İstifadəçi dangerous icazəsini verməkdən imtina edə bilər və proqram bu ssenarini düzgün emal etməlidir. Android 11+-da istifadəçi iki dəfə imtina edərsə, sonrakı sorğular sistem dialoqunu göstərmir — sistem avtomatik olaraq DENIED qaytarır. Bu halda istifadəçini parametrlərə yönləndirmək lazımdır.
Signature səviyyəsi — icazə, proqram sistemi və ya icazəni təyin edən digər proqramla eyni sertifikatla imzalanmışsa avtomatik verilir. Sistem və korporativ proqramlar üçün istifadə olunur. Nümunə: BIND_ACCESSIBILITY_SERVICE — yalnız sistem proqramları üçün əlçatandır.
Special səviyyəsi (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, REQUEST_INSTALL_PACKAGES, MANAGE_EXTERNAL_STORAGE) — sistem parametrləri vasitəsilə istifadəçinin ayrıca hərəkətini tələb edir. Proqram Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) ilə parametrlər səhifəsini aça bilər. Google Play special icazələrin istifadəsini məhdudlaşdırır və nəşr zamanı formada əsaslandırma tələb edir.
Android 6.0-dan başlayaraq bütün dangerous icazələri icra zamanı sorğu tələb edir. Kotlin-də runtime permissions ilə tam iş dövrünü nəzərdən keçirək.
Dangerous icazə tələb edən API-ni çağırmazdan əvvəl həmişə cari statusu ContextCompat.checkSelfPermission() ilə yoxlayın. Status PERMISSION_GRANTED-dirsə — API çağırıla bilər. PERMISSION_DENIED-dirsə — ActivityResultContract RequestPermission (AndroidX) və ya köhnəlmiş requestPermissions() vasitəsilə icazə sorğulanmalıdır.
Bir neçə icazəni eyni anda sorğulamaq üçün ActivityResultContracts.RequestMultiplePermissions istifadə etmək tövsiyə olunur. Google əlaqəli icazələrin (məsələn, video yazmaq üçün kamera + mikrofon) bir dialoqda qruplaşdırılmasını tövsiyə edir ki, istifadəçi sorğunun tam kontekstini görsün.
import android.Manifest
import android.content.pm.PackageManager
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
class CameraActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
openCamera()
} else {
explainWhyPermissionNeeded()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkCameraPermission()
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
openCamera()
}
shouldShowRequestPermissionRationale(
Manifest.permission.CAMERA
) -> {
showRationale()
}
else -> {
requestPermissionLauncher.launch(
Manifest.permission.CAMERA
)
}
}
}
}
İstifadəçi icazəni iki dəfə imtina edərsə, Android sorğunu “Never ask again” vəziyyətinə keçirir. Bu halda shouldShowRequestPermissionRationale() false qaytarır və sistem dialoqu göstərilməyəcək. Proqram istifadəçini Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) vasitəsilə sistem parametrlərinə yönləndirməlidir.
Vacib: ilk imtinadan dərhal sonra parametrləri açmağı təklif edən dialoq göstərməyin — bu aqressiv davranış kimi qəbul edilir. İzahatın göstərilməsinin lazım olub-olmadığını müəyyən etmək üçün shouldShowRequestPermissionRationale() istifadə edin. Material Design Guidelines sadəcə “Parametrləri aç” düyməsi deyil, girişin dəyərini izah edən ekran göstərməyi tövsiyə edir.
private fun openAppSettings() {
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)
).also { intent ->
startActivity(intent)
}
}
private fun showPermissionSettings() {
AlertDialog.Builder(this)
.setTitle("Kameraya giriş")
.setMessage("Parametrlərdə kameraya girişə icazə verin, "
+ "profil üçün foto çəkmək üçün")
.setPositiveButton("Parametrləri aç") { _, _ ->
openAppSettings()
}
.setNegativeButton("Ləğv et", null)
.show()
}
AndroidManifest.xml faylı proqramın istifadə etdiyi hər bir icazə üçün <uses-permission> elementi ehtiva edir. İcazələr <manifest> səviyyəsində <application> elementindən əvvəl bəyan edilir.
Hər bir icazə tam icazə adını göstərən android:name atributu ilə ayrıca <uses-permission> elementi kimi bəyan edilir. Müəyyən Android versiyalarında ortaya çıxan icazələr üçün maxSdkVersion atributundan istifadə edərək bəyannaməni yalnız lazımi versiyalarla məhdudlaşdırın — bu uyğunluğu yaxşılaşdırır.
Məsələn, WRITE_EXTERNAL_STORAGE icazəsi Android 10+-da (Scoped Storage) lazım deyil, ona görə də maxSdkVersion=„28” (Android 9) göstərin. Bu, yeni versiyalarda istifadəçilərdən lazımsız sualların qarşısını alır. Android Studio Lint vasitəsilə tövsiyə olunan maxSdkVersion barədə xəbərdarlıq edir.
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions (install-time) -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Dangerous permissions (runtime) -->
<uses-permission
android:name="android.permission.CAMERA" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Legacy storage permission limited to API 28 and below -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application>
<!-- ... -->
</application>
</manifest>
<uses-feature> elementi proqramın müəyyən avadanlıq (kamera, GPS, NFC) tələb etdiyini göstərir. android:required=„false” atributu proqramı bu avadanlıq olmayan cihazlarda quraşdırmağa imkan verir — əlçatanlıq yoxlaması kodda aparılır. required=„true” olarsa, Google Play proqramı filtrləyir və uyğun olmayan cihazlar üçün əlçatmaz olur.
Bütün avadanlıq funksiyaları üçün required=„false” göstərmək və əlçatanlığı PackageManager.hasSystemFeature() vasitəsilə proqramlı şəkildə yoxlamaq tövsiyə olunur. Bu proqramınızın auditoriyasını genişləndirir. Yeganə istisna — funksiyanın proqramın işləməsi üçün kritik olduğu haldır (GPS olmadan taksi sifariş proqramının mənası yoxdur).
İcazələrlə düzgün iş Android proqramının keyfiyyətinin əsas aspektidir. Əsas tövsiyələri və tipik səhvləri nəzərdən keçirək.
Yalnız proqramın işləməsi üçün həqiqətən zəruri olan icazələri sorğulayın. Hər bir artıq icazə quraşdırma konversiyasını azaldır və imtinaların sayını artırır. Google Play Console istifadəçilərin nə qədərinin icazə dəstinə görə quraşdırmadan imtina etdiyini göstərir. AppBrain (2024)-yə görə 10+ dangerous icazəsi olan proqramların 35% daha az quraşdırması var.
İcazə siyahısını mütəmadi olaraq nəzərdən keçirin. İstifadə olunmayanları silin, xüsusən də bəzi icazələrin isteğe bağlı olduğu yeni Android versiyalarına keçərkən. Məsələn, Android 13+-da foto seçicinin (ActivityResultContracts.PickVisualMedia) meydana gəlməsi ilə media kitabxanasına giriş READ_MEDIA_IMAGES dangerous icazəsi olmadan əldə edilə bilər.
Dangerous icazəsini sorğulamazdan əvvəl istifadəçiyə bu icazənin nə üçün lazım olduğunu və hansı dəyəri verdiyini izah edən ekran göstərin. Material Design işarə, qısa mətn və “Davam et” düyməsi olan bottom sheet və ya dialoqdan istifadə etməyi tövsiyə edir. Rationale birbaşa sorğu ilə müqayisədə razılığı 20–30% artırır.
launch() çağırmazdan əvvəl shouldShowRequestPermissionRationale() yoxlayın. true olarsa — rationale göstərin. false olarsa — ya icazə artıq verilib, ya da istifadəçi birdəfəlik imtina edib (never ask again). Sonuncu halda sorğunu təkrarlamaq əvəzinə “Parametrləri aç” düyməsini göstərin.
Bütün mümkün ssenariləri test edin: icazənin verilməsi, imtina, birdəfəlik imtina, parametrlərdə icazənin geri götürülməsi, icazələrin sıfırlanması (Android 11+ auto-reset). Hər ssenari crash və məlumat itkisi olmadan emal edilməlidir. Android Testing Guide testlərin avtomatlaşdırılması üçün TestPermission kitabxanasından istifadə etməyi tövsiyə edir.
Xüsusi diqqəti istifadəçinin proqram işləyərkən icazəni geri götürdüyü ssenariyə yetirin (kiçildilmiş proqram → Parametrlər → geri götürmə). Proqrama qayıtdıqda bütün icazələri onResume() vasitəsilə yenidən yoxlayın. İcazə statusunun keşləşdirilməsinə etibar etməyin — istifadəçi onları istənilən vaxt dəyişə bilər.
Tez-tez verilən suallar
Bəli, əgər SDK öz manifestinə icazə daxil edirsə, o, proqramın manifesti ilə birləşdirilir. SDK-nın lazımsız icazəsini AndroidManifest.xml-də tools:node=„remove” ilə söndürə bilərsiniz.
İcazəsiz API çağırışı SecurityException-a səbəb olacaq, bu da proqramın çökməsinə gətirib çıxarır. Həmişə müvafiq API-dən istifadə etməzdən əvvəl icazə statusunu yoxlayın və imtinanı düzgün emal edin.
Cihaz parametrlərində: Parametrlər → Proqramlar → [proqramınız] → İcazələr. Bütün icazələri sıfırlamaq üçün adb əmrindən istifadə edin: adb shell pm reset-permissions.
Bəli, Fragment və ya Service-də ActivityResultLauncher vasitəsilə. Lakin sorğu dialoqu həmişə Activity UI konteksti tələb edir. Service üçün sorğu ilə Activity açan Intent ilə Notification göstərə bilərsiniz.
Məsələn, WRITE_EXTERNAL_STORAGE Android 10+-da (Scoped Storage) lazım deyil. android:maxSdkVersion=„28” göstərməklə yeni versiyalarda icazə bəyannaməsini istisna edirsiniz ki, bu da uyğunluğu yaxşılaşdırır və sorğulanan icazələrin siyahısını azaldır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun