Runtime Permission: ουσία, τύποι και αρχή λειτουργίας στο Android

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-05-20 Χρόνος ανάγνωσης: 8 λεπ

Runtime Permission — ένας μηχανισμός αιτήματος αδειών κατά την εκτέλεση της εφαρμογής, που εισήχθη στο Android 6.0 (API 23). Σε αντίθεση με την εγκατάσταση δικαιωμάτων κατά την εγκατάσταση, τα runtime permissions επιτρέπουν στον χρήστη να παρέχει ή να ανακαλεί πρόσβαση σε ευαίσθητα δεδομένα (κάμερα, γεωτοποθεσία, επαφές) ανά πάσα στιγμή. Σύμφωνα με το Android Developers (2026), πάνω από το 85% των εφαρμογών στο Google Play χρησιμοποιούν τουλάχιστον ένα runtime permission.

Βασικά Σημεία

  • Runtime Permission — ο μηχανισμός Android που απαιτεί ρητή συγκατάθεση του χρήστη για πρόσβαση σε ευαίσθητα δεδομένα.
  • Dangerous permissions — ομάδα δικαιωμάτων που απαιτούν runtime αίτημα (κάμερα, μικρόφωνο, γεωτοποθεσία, επαφές).
  • Normal permissions — εγκρίνονται αυτόματα από το σύστημα και δεν απαιτούν runtime αίτημα (INTERNET, ACCESS_NETWORK_STATE).
  • One-time permissions — δικαιώματα για μία συνεδρία, που εισήχθησαν στο Android 11, ανακαλούνται αυτόματα όταν κλείνει η εφαρμογή.
  • shouldShowRequestPermissionRationale — μια σημαία που υποδεικνύει εάν πρέπει να εμφανιστεί εξήγηση στον χρήστη πριν από το αίτημα.

Τι είναι το Runtime Permission;

Runtime Permission (άδεια χρόνου εκτέλεσης) — είναι ένα μοντέλο ασφαλείας Android όπου η εφαρμογή ζητά πρόσβαση σε ευαίσθητα δεδομένα τη στιγμή που αυτή η λειτουργία είναι πραγματικά απαραίτητη στον χρήστη. Πριν από το Android 6.0, όλες οι άδειες παρέχονταν κατά την εγκατάσταση της εφαρμογής και ο χρήστης δεν μπορούσε να τις ανακαλέσει χωρίς πλήρη απεγκατάσταση.

Εξέλιξη του μοντέλου δικαιωμάτων Android

Πριν από το Android 6.0, ο χρήστης έβλεπε μια λίστα με όλα τα δικαιώματα κατά την εγκατάσταση και μπορούσε είτε να συμφωνήσει με όλα είτε να αρνηθεί την εγκατάσταση. Μια έρευνα του 2015 έδειξε ότι το 87% των χρηστών δεν διαβάζει τη λίστα δικαιωμάτων κατά την εγκατάσταση. Το Android 6.0 εισήγαγε τα runtime permissions, χωρίζοντας τα δικαιώματα σε normal (αυτόματα) και dangerous (με αίτημα). Το Android 11 πρόσθεσε τα one-time permissions — αυτόματη ανάκληση μετά το κλείσιμο της εφαρμογής. Το Android 13 εισήγαγε το Photo Picker και τις push ειδοποιήσεις ως ξεχωριστά runtime permissions.

Το iOS χρησιμοποιεί παρόμοιο μοντέλο από την έκδοση iOS 10, όπου η πρόσβαση στην κάμερα, το μικρόφωνο και τη γεωτοποθεσία ζητείται κατά την πρώτη χρήση. Ωστόσο, το iOS δεν έχει την έννοια των «normal permissions» — κάθε άδεια ζητείται ρητά και η άρνηση διατηρείται μέχρι το επόμενο αίτημα από τον προγραμματιστή μέσω των ρυθμίσεων συστήματος.

Πώς λειτουργεί το Runtime Permission στο Android;

Το Runtime Permission λειτουργεί μέσω ενός συστημικού διαλόγου που καλείται από τη μέθοδο requestPermissions() (AndroidX — ActivityResultLauncher). Το σύστημα εμφανίζει έναν τυπικό διάλογο με επεξήγηση και ο χρήστης επιλέγει «Να επιτραπεί» ή «Να απαγορευτεί». Μετά την απάντηση, καλείται ένα callback αποτελέσματος όπου η εφαρμογή επεξεργάζεται την απόφαση του χρήστη.

Αίτημα άδειας μέσω ActivityResultLauncher

kotlin
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    requestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
            if (isGranted) {
                startCamera()
            } else {
                showPermissionDeniedDialog()
            }
        }
}

private fun checkCameraPermission() {
    when {
        ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED -> {
            startCamera()
        }
        ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) -> {
            showRationaleDialog { requestPermissionLauncher.launch(Manifest.permission.CAMERA) }
        }
        else -> {
            requestPermissionLauncher.launch(Manifest.permission.CAMERA)
        }
    }
}

Η μέθοδος shouldShowRequestPermissionRationale επιστρέφει true εάν ο χρήστης έχει ήδη απορρίψει μία φορά το αίτημα. Σε αυτή την περίπτωση, συνιστάται να εμφανιστεί ένας διάλογος με επεξήγηση για το γιατί η εφαρμογή χρειάζεται την άδεια και μόνο στη συνέχεια να γίνει εκ νέου αίτημα. Αυτό αυξάνει την πιθανότητα συγκατάθεσης του χρήστη κατά 30–40% (στοιχεία Google I/O 2024).

Τύποι δικαιωμάτων στο Android

Το Android ταξινομεί όλα τα δικαιώματα σε διάφορα επίπεδα προστασίας: normal, dangerous, signature και special. Τα Normal permissions παρέχονται αυτόματα κατά την εγκατάσταση. Τα Dangerous permissions απαιτούν runtime αίτημα. Τα Signature permissions είναι διαθέσιμα μόνο σε εφαρμογές που είναι υπογεγραμμένες με το ίδιο πιστοποιητικό.

Ομάδες επικίνδυνων δικαιωμάτων

ΟμάδαΔικαιώματαAPI Level
CAMERACAMERAAPI 23+
LOCATIONACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATIONAPI 23+ (background — API 29+)
STORAGEREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+)API 23+ (αλλαγές σε API 33)
PHONEREAD_PHONE_STATE, CALL_PHONE, READ_CALL_LOGAPI 23+
MICROPHONERECORD_AUDIOAPI 23+
CONTACTSREAD_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTSAPI 23+
NOTIFICATIONSPOST_NOTIFICATIONSAPI 33+

Τα Special permissions (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, MANAGE_EXTERNAL_STORAGE) απαιτούν επιπλέον μετάβαση στις ρυθμίσεις συστήματος μέσω Settings.ACTION_MANAGE_OVERLAY_PERMISSION. Αυτές οι άδειες δεν μπορούν να ζητηθούν με τον τυπικό συστημικό διάλογο και απαιτούν ρητή μετάβαση του χρήστη στην οθόνη ρυθμίσεων.

Αίτημα δικαιωμάτων σε Android 12+

Το Android 12 παρουσίασε σημαντικές αλλαγές στο μοντέλο runtime permissions. Τα One-time permissions επιτρέπουν την παροχή πρόσβασης στην κάμερα, το μικρόφωνο ή τη γεωτοποθεσία μόνο για μία συνεδρία. Μόλις ο χρήστης κλείσει την εφαρμογή, η άδεια ανακαλείται αυτόματα. Οι Privacy indicators — πράσινοι δείκτες στη γραμμή κατάστασης που δείχνουν πότε η εφαρμογή χρησιμοποιεί κάμερα ή μικρόφωνο.

Χειρισμός εφάπαξ δικαιωμάτων

kotlin
// Android 12+ — χειρισμός εφάπαξ άδειας γεωτοποθεσίας
private fun checkLocationPermission() {
    val permissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->

        val fineLocationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION]
        val coarseLocationGranted = permissions[Manifest.permission.ACCESS_COARSE_LOCATION]

        if (fineLocationGranted == true) {
            showUserLocation()
        } else {
            showLocationDisabledDialog()
        }
    }

    permissionLauncher.launch(
        arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )
}

// Έλεγχος εάν η άδεια ανακλήθηκε από το σύστημα (Android 12+)
class PermissionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == Intent.ACTION_PERMISSION_REVOCATION) {
            handleRevokedPermission(intent.getStringExtra(Intent.EXTRA_REVOKED_PERMISSION))
        }
    }
}

Το Android 13 πρόσθεσε την άδεια POST_NOTIFICATIONS στην ομάδα dangerous, απαιτώντας ρητό αίτημα για αποστολή push ειδοποιήσεων. Το Android 14 εισήγαγε περιορισμούς στη γεωτοποθεσία παρασκηνίου: η εφαρμογή πρέπει να λαμβάνει ρητή έγκριση του χρήστη κάθε φορά που ζητά background location. Το Photo Picker (API 33+) αντικατέστησε την ανάγκη για READ_EXTERNAL_STORAGE για την επιλογή εικόνων.

Χειρισμός αρνήσεων χρήστη

Η άρνηση του χρήστη στην παροχή άδειας είναι μια κανονική κατάσταση που πρέπει να αντιμετωπίζεται σωστά. Υπάρχουν δύο τύποι άρνησης: εφάπαξ (ο χρήστης πάτησε «Απαγόρευση») και μόνιμη (ο χρήστης επέλεξε «Να μην ερωτηθεί ξανά»). Στη δεύτερη περίπτωση, ο συστημικός διάλογος δεν εμφανίζεται πλέον και η εφαρμογή πρέπει να ανακατευθύνει τον χρήστη στις ρυθμίσεις συστήματος.

Στρατηγική χειρισμού αρνήσεων

Μετά την πρώτη άρνηση, η εφαρμογή θα πρέπει να εμφανίσει ένα rationale dialog — μια δική της εξήγηση γιατί η άδεια είναι απαραίτητη. Εάν ο χρήστης αρνηθεί ξανά, θα πρέπει να ανακατευθυνθεί στην οθόνη ρυθμίσεων της εφαρμογής μέσω Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Το Material 3 συνιστά τη χρήση PermissionRequestBottomSheet για πιο φυσικό UX.

Είναι σημαντικό να μην μπλοκάρετε πλήρως τη λειτουργικότητα της εφαρμογής σε περίπτωση άρνησης. Για παράδειγμα, εάν ο χρήστης αρνήθηκε τη γεωτοποθεσία, η εφαρμογή θα πρέπει να προσφέρει εισαγωγή της διεύθυνσης χειροκίνητα. Για την κάμερα — να δώσει τη δυνατότητα φόρτωσης εικόνας από τη συλλογή. Το Google συνιστά να παρέχεται πάντα ένας εναλλακτικός μηχανισμός για όλα τα runtime permissions.

Συστάσεις ασφαλείας

Τα Runtime permissions δεν είναι μόνο ένας τεχνικός μηχανισμός, αλλά και ένα στοιχείο εμπιστοσύνης του χρήστη προς την εφαρμογή. Η αίτηση άδειας σε ακατάλληλη στιγμή (για παράδειγμα, κατά την πρώτη εκκίνηση) μειώνει σημαντικά την πιθανότητα συγκατάθεσης. Το Google Play Store αναλύει τη συχνότητα και το πλαίσιο των αιτημάτων αδειών: οι εφαρμογές με επιθετικά αιτήματα λαμβάνουν χαμηλότερες θέσεις στα αποτελέσματα αναζήτησης.

Κανόνες αιτήματος δικαιωμάτων

Πλαίσιο — ζητάτε άδεια αμέσως πριν από την εκτέλεση της ενέργειας που την απαιτεί. Ελάχιστο — ζητάτε μόνο τα δικαιώματα που είναι πραγματικά απαραίτητα για τη λειτουργία της δυνατότητας. Διαφάνεια — εξηγήστε στον χρήστη γιατί χρειάζεται η άδεια πριν από τον συστημικό διάλογο. Ανάκληση — εγγραφείτε στο ACTION_PERMISSION_REVOCATION για σωστό χειρισμό ανάκλησης άδειας κατά τον χρόνο εκτέλεσης.

Για δοκιμή runtime permissions χρησιμοποιήστε εντολές adb: adb shell pm revoke <package> android.permission.CAMERA επιτρέπει την προσομοίωση ανάκλησης άδειας χωρίς επανεγκατάσταση της εφαρμογής. Το Espresso και το UiAutomator υποστηρίζουν δοκιμή διαλόγων αδειών μέσω GrantPermissionRule. Η ενσωμάτωση αυτών των εργαλείων στο CI/CD pipeline είναι υποχρεωτική για εφαρμογές με runtime permissions.

Έλεγχος δικαιωμάτων στο Google Play Console

Το Google Play Console παρέχει μια ενότητα Permission auditing (έλεγχος δικαιωμάτων), όπου ο προγραμματιστής βλέπει πόσο συχνά ζητούνται δικαιώματα, ποιο ποσοστό χρηστών παρέχει πρόσβαση και ποια δικαιώματα ανακλήθηκαν. Η ανάλυση αυτών των δεδομένων βοηθά στον εντοπισμό αναποτελεσματικών αιτημάτων και στη βελτιστοποίηση του UX. Για παράδειγμα, εάν λιγότερο από το 40% των χρηστών παρέχουν γεωτοποθεσία, αξίζει να επανεξετάσετε τον χρονισμό του αιτήματος και να προσθέσετε ένα πιο πειστικό rationale.

Η χρήση του Android Vitals για παρακολούθηση permission-related ANR (Application Not Responding) είναι επίσης κρίσιμη. Εάν το αίτημα άδειας εκτελείται στο κύριο νήμα ή ο συστημικός διάλογος μπλοκάρει το UI, αυτό μπορεί να προκαλέσει ANR σε αργές συσκευές. Μεταφέρετε τον έλεγχο και το αίτημα αδειών σε ξεχωριστό νήμα ή χρησιμοποιήστε coroutines Kotlin για ασύγχρονη επεξεργασία, ώστε να αποφύγετε το μπλοκάρισμα της διεπαφής χρήστη.

Συχνές Ερωτήσεις

Πώς να ξεχωρίσετε μια εφάπαξ άρνηση από μια μόνιμη;

Η shouldShowRequestPermissionRationale επιστρέφει false σε περίπτωση μόνιμης άρνησης (όταν ο χρήστης επέλεξε «Να μην ερωτηθεί ξανά»). Η μέθοδος επιστρέφει true σε περίπτωση εφάπαξ άρνησης, επιτρέποντας την εμφάνιση ενός rationale διαλόγου. Εάν η μέθοδος επέστρεψε false, η μόνη λύση είναι να ανακατευθύνετε τον χρήστη στις ρυθμίσεις συστήματος της εφαρμογής.

Μπορώ να ζητήσω πολλαπλές άδειες ταυτόχρονα;

Ναι, το ActivityResultContracts.RequestMultiplePermissions επιτρέπει την αίτηση μιας σειράς δικαιωμάτων με μία κλήση. Το σύστημα θα εμφανίσει διαδοχικά διαλόγους για κάθε άδεια. Συνιστάται να ομαδοποιείτε λογικά συνδεδεμένα δικαιώματα (για παράδειγμα, CAMERA και RECORD_AUDIO για βιντεοσκόπηση), αλλά να μην ζητάτε περισσότερα από 2–3 ταυτόχρονα.

Πώς λειτουργούν τα runtime permissions σε Android TV και Wear OS;

Το Android TV χρησιμοποιεί το ίδιο μοντέλο runtime permissions με εμφάνιση διαλόγων στην τηλεοπτική οθόνη. Το Wear OS έκδοσης 3+ υποστηρίζει runtime permissions, αλλά οι διάλογοι εμφανίζονται στο ρολόι. Για το Android Auto, όλες οι άδειες ζητούνται στο τηλέφωνο και το σύστημα του αυτοκινήτου λαμβάνει ήδη εγκεκριμένα δικαιώματα μέσω σύνδεσης bridge.

Ποιες αλλαγές στα δικαιώματα αναμένονται στο Android 16;

Σύμφωνα με προκαταρκτικές πληροφορίες, το Android 16 εισάγει τη «λήξη άδειας» για εφάπαξ δικαιώματα με αυτόματη ανάκληση μετά από 24 ώρες. Επίσης, αναμένεται αυστηροποίηση των απαιτήσεων για background location και επέκταση της λίστας dangerous permissions για νέες κατηγορίες (αισθητήρες περιβάλλοντος, Wi-Fi scanning). Ακριβείς λεπτομέρειες θα ανακοινωθούν το Q3 2027.

Πώς διαφέρει το runtime permission στο Android από το iOS;

Το iOS δεν υποστηρίζει «normal permissions» — κάθε άδεια ζητείται ρητά μέσω συστημικού διαλόγου. Ο χρήστης μπορεί να ανακαλέσει την άδεια ανά πάσα στιγμή μέσω των ρυθμίσεων. Η κύρια διαφορά είναι ότι το iOS δεν ελέγχει προηγουμένως την κατάσταση της άδειας μέσω κάποιου αντίστοιχου του checkSelfPermission: το σύστημα εμφανίζει αυτόματα τον διάλογο κατά την πρώτη πρόσβαση σε ένα προστατευμένο API.

Σύνοψη

  • Runtime Permission — μηχανισμός αιτήματος ευαίσθητων δεδομένων τη στιγμή της πραγματικής τους χρήσης, που εισήχθη στο Android 6.0.
  • Τα Dangerous permissions απαιτούν ρητό συστημικό διάλογο, τα normal permissions εγκρίνονται αυτόματα.
  • Τα One-time permissions (Android 12+) ανακαλούνται όταν κλείνει η εφαρμογή, αυξάνοντας το απόρρητο του χρήστη.
  • Η shouldShowRequestPermissionRationale καθορίζει εάν υπήρξε προηγούμενη άρνηση και βοηθά στην επιλογή στρατηγικής αιτήματος.
  • Το Android 13 πρόσθεσε το POST_NOTIFICATIONS ως runtime permission, το Android 14 αυστηροποίησε τις απαιτήσεις για γεωτοποθεσία παρασκηνίου.
  • Το Photo Picker (API 33+) αντικαθιστά την ανάγκη για READ_EXTERNAL_STORAGE στην επιλογή εικόνων.
  • Πάντα να παρέχετε εναλλακτική λύση σε περίπτωση άρνησης του χρήστη — εναλλακτικό τρόπο εισαγωγής δεδομένων ή χειροκίνητη επιλογή.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης