Normal Permission — μια κατηγορία δικαιωμάτων στο Android που το σύστημα χορηγεί αυτόματα χωρίς να ρωτά τον χρήστη. Σύμφωνα με το Android Developer Documentation, 2024, τα κανονικά δικαιώματα έχουν ProtectionLevel normal και δεν απαιτούν runtime διάλογο, σε αντίθεση με τα επικίνδυνα. Καλύπτουν πρόσβαση στο διαδίκτυο, κατάσταση δικτύου και δόνηση, χωρίς να δημιουργούν κίνδυνο για τα εμπιστευτικά δεδομένα του χρήστη.
Κύρια σημεία
Normal Permission — ένας τύπος δικαιωμάτων συστήματος Android με ProtectionLevel normal, που χορηγείται αυτόματα στην εφαρμογή τη στιγμή της εγκατάστασης. Ο προγραμματιστής δεν χρειάζεται να γράψει κώδικα για αίτημα — αρκεί να αναφέρει το δικαίωμα στο AndroidManifest.xml. Ο χρήστης δεν βλέπει διαλόγους και δεν μπορεί να ανακαλέσει το normal permission ξεχωριστά, μόνο διαγράφοντας ολόκληρη την εφαρμογή.
Το σύστημα Android ταξινομεί τα κανονικά δικαιώματα ως χαμηλού κινδύνου — δεν παρέχουν πρόσβαση σε προσωπικά δεδομένα, κάμερα ή μικρόφωνο. Τυπικά παραδείγματα: πρόσβαση στο διαδίκτυο, διαχείριση δόνησης, ανάγνωση κατάστασης Wi-Fi. Σύμφωνα με το Android Security Model (2024), περίπου το 40 τοις εκατό όλων των δικαιωμάτων συστήματος ανήκουν στην κατηγορία normal.
Σημαντική ιδιότητα — τα κανονικά δικαιώματα δεν ανακαλούνται κατά τον χρόνο εκτέλεσης μέσω Settings. Εάν ο χρήστης θέλει να απαγορεύσει την πρόσβαση, ο μόνος τρόπος είναι να διαγράψει την εφαρμογή. Οι προγραμματιστές θα πρέπει να το λαμβάνουν υπόψη στην αρχιτεκτονική, αλλά για τους χρήστες αυτή η προσέγγιση απλοποιεί την αλληλεπίδραση: χωρίς διαλόγους κατά την πρώτη εκκίνηση.
Ο διαχωρισμός σε κανονικά και επικίνδυνα δικαιώματα εμφανίστηκε στο Android 6.0 Marshmallow (API 23). Πριν από αυτήν την έκδοση, όλα τα δικαιώματα ζητούνταν κατά την εγκατάσταση — ο χρήστης έβλεπε μια ενιαία λίστα και την αποδεχόταν ή την απέρριπτε στο σύνολό της. Το Normal Permission διατήρησε αυτό το μοντέλο για λειτουργίες χαμηλού κινδύνου, ενώ το Dangerous πέρασε σε runtime αίτημα. Αυτή η αλλαγή βελτίωσε την εμπειρία χρήστη και ταυτόχρονα αύξησε την ασφάλεια.
Πολλά API συστήματος Android απαιτούν ρητή αναφορά κανονικού δικαιώματος, ακόμα κι αν η πρόσβαση είναι αυτόματη. Για παράδειγμα, η κλάση ConnectivityManager απαιτεί ACCESS_NETWORK_STATE, το VibratorService απαιτεί VIBRATE, το WifiManager απαιτεί ACCESS_WIFI_STATE. Χωρίς δήλωση του αντίστοιχου uses-permission, η κλήση αυτών των API θα οδηγήσει σε SecurityException.
ProtectionLevel normal — το ελάχιστο επίπεδο προστασίας στο Android Permission System. Τα δικαιώματα με αυτό το επίπεδο δηλώνονται στο manifest και το σύστημα ελέγχει τη δήλωση κατά την εγκατάσταση, παρέχοντας πρόσβαση χωρίς παρέμβαση του χρήστη. Κανένα στοιχείο UI δεν εμφανίζεται, κανένα callback δεν καλείται.
Ο μηχανισμός ελέγχου λειτουργεί στο επίπεδο PackageManager. Κατά την εγκατάσταση του APK, το σύστημα σαρώνει όλες τις ετικέτες uses-permission, καθορίζει το επίπεδο προστασίας κάθε δικαιώματος μέσω αντιστοίχισης με ορισμούς συστήματος στα αρχεία permissions.xml και για normal-level απλώς καταγράφει την πρόσβαση. Η διαδικασία διαρκεί χιλιοστά του δευτερολέπτου και δεν απαιτεί αλληλεπίδραση με τη διεπαφή χρήστη.
Ο αλγόριθμος χορήγησης έχει ως εξής:
Ο χρήστης δεν μπορεί να ανακαλέσει το κανονικό δικαίωμα μέσω της διεπαφής. Στις ρυθμίσεις της εφαρμογής, στην ενότητα Δικαιώματα, εμφανίζονται μόνο τα επικίνδυνα δικαιώματα. Αυτό έρχεται σε αντίθεση με το iOS, όπου κάθε δικαίωμα απαιτεί ξεχωριστή επιβεβαίωση ανεξάρτητα από το επίπεδο ευαισθησίας της λειτουργίας.
Normal και Dangerous Permission — δύο αντίθετες κατηγορίες προστασίας στο Android. Η κύρια διαφορά είναι στον τρόπο χορήγησης: τα κανονικά δίνονται αυτόματα κατά την εγκατάσταση, τα επικίνδυνα απαιτούν ρητή συγκατάθεση μέσω runtime διαλόγου. Αυτή η διαφορά είναι ενσωματωμένη στην αρχιτεκτονική ασφαλείας του Android από την έκδοση 6.0 Marshmallow.
Σύγκριση βασικών χαρακτηριστικών:
| Χαρακτηριστικό | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| Αίτημα χρήστη | Δεν απαιτείται | Runtime διάλογος υποχρεωτικός |
| Δυνατότητα ανάκλησης | Όχι, μόνο διαγραφή εφαρμογής | Ναι, μέσω ρυθμίσεων ανά πάσα στιγμή |
| Έλεγχος στον κώδικα | Πάντα PERMISSION_GRANTED | checkSelfPermission υποχρεωτικός |
| Παραδείγματα | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
Ο χρήστης δεν βλέπει κανέναν διάλογο στο αίτημα Normal Permission. Εάν η εφαρμογή χρειάζεται INTERNET — το λαμβάνει σιωπηλά. Για Dangerous Permission, το σύστημα εμφανίζει ένα modal dialog με περιγραφή της ζητούμενης πρόσβασης. Ο χρήστης πατάει Allow ή Deny και αργότερα μπορεί να ανακαλέσει το δικαίωμα ανά πάσα στιγμή μέσω Settings. Αυτή είναι η βασική διαφορά UX που καθορίζει τη στρατηγική ανάπτυξης της διεπαφής.
Το Normal πρέπει να χρησιμοποιείται σε όλες τις περιπτώσεις όπου η πρόσβαση δεν αφορά ευαίσθητα δεδομένα. ACCESS_NETWORK_STATE για έλεγχο σύνδεσης, VIBRATE για απτική ανάδραση, INTERNET για HTTP αιτήματα — όλα αυτά είναι κανονικά δικαιώματα. Η εφαρμογή επιπέδου dangerous όπου αρκεί το normal είναι κακή πρακτική, δημιουργεί περιττούς διαλόγους και μειώνει την εμπιστοσύνη του χρήστη στην εφαρμογή.
Το Android ορίζει δεκάδες κανονικά δικαιώματα, καθένα από τα οποία αντιστοιχεί σε μια συγκεκριμένη λειτουργία συστήματος. Όλα είναι προσβάσιμα μέσω σταθερών της κλάσης Manifest.permission. Ακολουθεί μια λίστα με τα πιο συχνά χρησιμοποιούμενα στην ανάπτυξη εφαρμογών.
| Σταθερά | Πρόσβαση | Περιγραφή |
|---|---|---|
| INTERNET | Δίκτυο | Άνοιγμα δικτυακών sockets για HTTP αιτήματα |
| ACCESS_NETWORK_STATE | Δίκτυο | Λήψη πληροφοριών σχετικά με την κατάσταση του δικτύου |
| ACCESS_WIFI_STATE | Wi-Fi | Ανάγνωση πληροφοριών για συνδέσεις Wi-Fi |
| VIBRATE | Δόνηση | Έλεγχος του κινητήρα δόνησης της συσκευής |
| BLUETOOTH | Bluetooth | Σύνδεση με συσκευές Bluetooth |
| WAKE_LOCK | Τροφοδοσία | Αποτροπή μετάβασης του επεξεργαστή σε κατάσταση ύπνου |
| SET_ALARM | Ξυπνητήρι | Ρύθμιση ξυπνητηριού μέσω AlarmManager |
| CHANGE_NETWORK_STATE | Δίκτυο | Αλλαγή κατάστασης δικτυακής σύνδεσης |
Τα κανονικά δικαιώματα δεν ομαδοποιούνται σε Permission Group για σκοπούς εμφάνισης στο UI. Οι ομάδες στο Android προορίζονται για την οθόνη ρυθμίσεων, όπου εμφανίζονται μόνο τα επικίνδυνα δικαιώματα. Ωστόσο, λογικά τα κανονικά δικαιώματα μπορούν να χωριστούν σε κατηγορίες: δικτυακά (INTERNET, ACCESS_NETWORK_STATE), υλικού (VIBRATE, WAKE_LOCK), συστήματος (SET_ALARM) και Bluetooth δικαιώματα.
Ορισμένες σταθερές από το Manifest.permission μπορεί να αλλάξουν το επίπεδο προστασίας σε διαφορετικές εκδόσεις Android. Για παράδειγμα, το BLUETOOTH_CONNECT στο Android 12+ έγινε επικίνδυνο δικαίωμα με runtime αίτημα, αν και σε παλαιότερες εκδόσεις ήταν normal. Οι προγραμματιστές συνιστάται να ελέγχουν το τρέχον protectionLevel για το στοχευόμενο API μέσω τεκμηρίωσης.
Ο προγραμματιστής μπορεί να ελέγξει προγραμματιστικά εάν ένα δικαίωμα είναι κανονικό μέσω PackageManager. Η μέθοδος getPermissionInfo επιστρέφει PermissionInfo, του οποίου το πεδίο protectionLevel περιέχει τη σημαία PermissionInfo.PROTECTION_NORMAL. Αυτό είναι χρήσιμο για δυναμική επεξεργασία και εντοπισμό σφαλμάτων.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Η δήλωση Normal Permission στο AndroidManifest.xml είναι η απλούστερη λειτουργία, που απαιτεί μόνο μία ετικέτα uses-permission. Πρόσθετη διαμόρφωση protectionLevel δεν απαιτείται, καθώς το επίπεδο προστασίας καθορίζεται από τον ορισμό συστήματος, όχι από το manifest της εφαρμογής. Ο προγραμματιστής απλώς αναφέρει το πλήρες όνομα της σταθεράς.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
Το σύστημα κατά την εγκατάσταση επεξεργάζεται όλες τις δηλώσεις. Εάν τουλάχιστον ένα από τα αναφερόμενα δικαιώματα έχει protectionLevel διαφορετικό από normal, θα απαιτηθεί runtime αίτημα. INTERNET — το πιο δημοφιλές κανονικό δικαίωμα, παρόν στις περισσότερες εφαρμογές Android, ιδιαίτερα σε εκείνες που εκτελούν HTTP αιτήματα ή φορτώνουν περιεχόμενο από το δίκτυο.
Το πλήρες παράδειγμα AndroidManifest.xml με κανονικά και επικίνδυνο δικαίωμα δείχνει τη διαφορά: συντακτικά οι ετικέτες uses-permission είναι ίδιες, αλλά στη φάση εκτέλεσης τα INTERNET και VIBRATE θα χορηγηθούν αυτόματα, ενώ το CAMERA θα απαιτήσει διάλογο.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
Κατά τη χρήση βιβλιοθηκών — Google Play Services, Firebase, Glide — αυτές μπορούν να προσθέσουν δικά τους uses-permission στο τελικό manifest μέσω Manifest Merger. Ορισμένες από αυτές είναι κανονικές (INTERNET για Firebase), άλλες επικίνδυνες (ACCESS_FINE_LOCATION για Google Maps). Ο προγραμματιστής θα πρέπει να ελέγχει το τελικό συγχωνευμένο manifest στο build/outputs/logs/manifest-merger-report.txt πριν από τη δημοσίευση.
Normal Permission έχει δύο βασικούς περιορισμούς: αδυναμία ανάκλησης από τον χρήστη και απουσία UI για διαχείριση. Εάν ο χρήστης δεν εμπιστεύεται την εφαρμογή, αλλά το κανονικό δικαίωμα έχει ήδη χορηγηθεί αυτόματα — η μόνη λύση είναι η διαγραφή της εφαρμογής. Αυτό δημιουργεί συγκεκριμένο κίνδυνο, καθώς τα κανονικά δικαιώματα δεν μπλοκάρονται από τα τυπικά εργαλεία του Android.
Ένας πρόσθετος περιορισμός εμφανίζεται σε συσκευές με πολλαπλά προφίλ (Work Profile, Multiple Users). Το Normal Permission χορηγείται αμέσως για όλα τα προφίλ — η εφαρμογή δεν μπορεί να περιορίσει το δικαίωμα μόνο σε ένα. Σε εταιρικά σενάρια, αυτό επιλύεται μέσω Managed Configurations.
Δεν είναι δυνατόν να ελεγχθεί εάν η εφαρμογή χρησιμοποιεί το Normal Permission τη δεδομένη στιγμή. Η μέθοδος συστήματος checkSelfPermission λειτουργεί μόνο για επικίνδυνα δικαιώματα. Για normal επιστρέφει πάντα PERMISSION_GRANTED, το οποίο δεν αντικατοπτρίζει την πραγματική δραστηριότητα. Αυτό πρέπει να λαμβάνεται υπόψη κατά τον έλεγχο ασφαλείας και την ανάλυση συμπεριφοράς της εφαρμογής.
Επίσης, αξίζει να σημειωθεί ότι ορισμένοι κατασκευαστές συσκευών (Xiaomi, Huawei, Samsung) τροποποιούν την τυπική συμπεριφορά των δικαιωμάτων. Στο υλικολογισμικό τους, το Normal Permission μπορεί να απαιτεί πρόσθετες άδειες στο ιδιόκτητο περιβάλλον MIUI ή EMUI. Οι προγραμματιστές συνιστάται να δοκιμάζουν τη λειτουργία σε πραγματικές συσκευές διαφορετικών κατασκευαστών.
Συχνές Ερωτήσεις
Normal Permission χορηγείται αυτόματα κατά την εγκατάσταση χωρίς διάλογο. Το Dangerous απαιτεί runtime αίτημα με ρητή συγκατάθεση του χρήστη και μπορεί να ανακληθεί μέσω ρυθμίσεων. Το Normal χρησιμοποιεί ProtectionLevel normal, το Dangerous — protectionLevel dangerous.
Όχι, για τα κανονικά δικαιώματα αρκεί να δηλώσετε uses-permission στο AndroidManifest.xml. Κώδικας για αίτημα δεν απαιτείται — το σύστημα παρέχει πρόσβαση αυτόματα. Αυτό τα διαφοροποιεί από τα επικίνδυνα, όπου χρειάζεται ActivityCompat.requestPermissions.
Τα πιο συχνά χρησιμοποιούμενα: INTERNET (δικτυακά αιτήματα), ACCESS_NETWORK_STATE (έλεγχος σύνδεσης), VIBRATE (απτική ανάδραση) και WAKE_LOCK (διατήρηση επεξεργαστή). Σχεδόν κάθε εφαρμογή Android χρησιμοποιεί τουλάχιστον INTERNET.
Όχι, το Normal Permission δεν μπορεί να ανακληθεί μέσω των ρυθμίσεων της εφαρμογής. Ο μόνος τρόπος να σταματήσει η πρόσβαση είναι η διαγραφή της εφαρμογής. Αυτή είναι η βασική διαφορά από τα επικίνδυνα δικαιώματα, τα οποία ο χρήστης μπορεί να απενεργοποιήσει ανά πάσα στιγμή.
Χρησιμοποιήστε το PackageManager.getPermissionInfo, μεταβιβάζοντας το όνομα του δικαιώματος. Η μέθοδος επιστρέφει PermissionInfo με το πεδίο protectionLevel. Συγκρίνετε με τις σταθερές PermissionInfo.PROTECTION_NORMAL ή PROTECTION_DANGEROUS για να προσδιορίσετε την κατηγορία.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης