Storage Access Framework — είναι ένα πλαίσιο Android για ασφαλή πρόσβαση σε αρχεία και έγγραφα μέσω του συστήματος διαλόγου επιλογής. Αντί να ζητά ευρείες άδειες ανάγνωσης αποθηκευτικού χώρου, η εφαρμογή λαμβάνει έναν σύνδεσμο URI στο αρχείο που επέλεξε ο χρήστης. Σύμφωνα με τους Android Developers (2026), το SAF υποστηρίζει τοπικό αποθηκευτικό χώρο, υπηρεσίες cloud Google Drive και Dropbox μέσω του DocumentProvider. Το πλαίσιο εισήχθη στο Android 4.4 και έγινε το πρότυπο εργασίας με έγγραφα ξεκινώντας από το Android 10.
Κύρια σημεία
Storage Access Framework — είναι ένα μέρος του Android SDK που παρέχει μια ενοποιημένη διεπαφή για επιλογή και δημιουργία εγγράφων μέσω του συστήματος διαλόγου. Το SAF αφαιρεί τη φυσική τοποθεσία των αρχείων: η εφαρμογή δεν γνωρίζει από πού διαβάζεται το αρχείο — από τον τοπικό δίσκο, το Google Drive ή το Dropbox.
Η αρχιτεκτονική του SAF περιλαμβάνει τρία στοιχεία: την εφαρμογή-πελάτη που ξεκινά το αίτημα, τον επιλογέα συστήματος — το τυπικό παράθυρο διαλόγου επιλογής αρχείου, και τον DocumentProvider — τον πάροχο περιεχομένου που υλοποιεί την πρόσβαση σε αρχεία ενός συγκεκριμένου αποθηκευτικού χώρου. Ο χρήστης βλέπει μια ενοποιημένη διεπαφή ανεξάρτητα από την πηγή δεδομένων.
Το SAF είναι διαθέσιμο από Android 4.4 (API 19). Αρχικά το πλαίσιο υποστήριζε μόνο έγγραφα, αλλά στο Android 5.0 προστέθηκε υποστήριξη για καταλόγους μέσω ACTION_OPEN_DOCUMENT_TREE. Από το Android 10, το SAF έγινε ο προτεινόμενος τρόπος πρόσβασης σε οποιοδήποτε αρχείο εκτός του app-specific storage.
Το SAF εκκινεί το παράθυρο διαλόγου συστήματος επιλογής αρχείου μέσω Intent με ενέργεια ACTION_OPEN_DOCUMENT. Ο χρήστης βλέπει μια λίστα διαθέσιμων πηγών: εσωτερική αποθήκευση, Google Drive, Dropbox και άλλους εγγεγραμμένους παρόχους. Μετά την επιλογή αρχείου, το σύστημα επιστρέφει ένα content URI με προσωρινά δικαιώματα πρόσβασης.
Το content URI έχει μορφή content://com.android.externalstorage.documents/document/primary/Download/file.pdf. Σε αντίθεση με το file:// URI, το content URI δεν αποκαλύπτει την πραγματική διαδρομή του αρχείου και λειτουργεί μέσω DocumentProvider. Η εφαρμογή διαβάζει το αρχείο μέσω ContentResolver.openInputStream βάσει του ληφθέντος URI.
Ο επιλογέας συστήματος υποστηρίζει αυτόματα αναζήτηση, ταξινόμηση και φιλτράρισμα αρχείων ανά τύπο MIME. Ο προγραμματιστής καθορίζει τους απαιτούμενους τύπους μέσω Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*")), και ο επιλογέας εμφανίζει μόνο σχετικά αρχεία.
Από προεπιλογή, το URI είναι έγκυρο μέχρι την επανεκκίνηση της εφαρμογής ή την επανεκκίνηση της συσκευής. Για μακροπρόθεσμη πρόσβαση, η εφαρμογή ζητά takePersistableUriPermission — αυτό επιτρέπει την ανάγνωση του αρχείου σε επόμενες εκκινήσεις χωρίς εκ νέου επιλογή μέσω διαλόγου.
Το SAF παρέχει τρεις κύριες ενέργειες για εργασία με αρχεία: άνοιγμα, δημιουργία και επιλογή δέντρου φακέλων. Το ACTION_OPEN_DOCUMENT ανοίγει τον επιλογέα συστήματος για επιλογή υπάρχοντος αρχείου. Το ACTION_CREATE_DOCUMENT δημιουργεί ένα νέο αρχείο — ο χρήστης εισάγει το όνομα στο παράθυρο διαλόγου και η εφαρμογή λαμβάνει URI για εγγραφή.
Το ACTION_OPEN_DOCUMENT_TREE επιτρέπει την επιλογή ολόκληρου καταλόγου και πρόσβαση σε όλα τα αρχεία εντός αυτού. Χρησιμοποιείται σε διαχειριστές αρχείων, εφαρμογές δημιουργίας αντιγράφων ασφαλείας και συγχρονισμού. Η εφαρμογή λαμβάνει URI του καταλόγου και μπορεί να απαριθμεί αναδρομικά το περιεχόμενο μέσω DocumentFile.
| Ενέργεια | Σκοπός | Σημαία |
|---|---|---|
| ACTION_OPEN_DOCUMENT | Επιλογή υπάρχοντος αρχείου | READ_FLAG |
| ACTION_CREATE_DOCUMENT | Δημιουργία νέου αρχείου | WRITE_FLAG |
| ACTION_OPEN_DOCUMENT_TREE | Επιλογή καταλόγου | READ + WRITE |
Για κάθε ενέργεια, οι τύποι MIME καθορίζονται μέσω EXTRA_MIME_TYPES. Μπορούν να καθοριστούν πολλοί τύποι: "application/pdf", "image/*", "text/plain". Εάν δεν καθοριστούν τύποι, ο επιλογέας εμφανίζει όλα τα αρχεία.
Persistent URI permissions — μηχανισμός SAF που επιτρέπει τη διατήρηση πρόσβασης στο αρχείο μετά το τέλος της τρέχουσας συνεδρίας. Χωρίς αυτή τη σημαία, το URI είναι έγκυρο μόνο μέχρι την επανεκκίνηση της εφαρμογής. Η εφαρμογή ζητά τη σημαία FLAG_GRANT_PERSISTABLE_URI_PERMISSION μαζί με τις σημαίες READ και WRITE.
Για τη διατήρηση δικαιωμάτων χρησιμοποιείται η μέθοδος ContentResolver.takePersistableUriPermission. Το σύστημα αποθηκεύει το URI σε ειδικό μητρώο και αποκαθιστά την πρόσβαση κατά την επόμενη εκκίνηση της εφαρμογής. Για να ελέγξετε εάν η εφαρμογή έχει μόνιμη πρόσβαση στο URI, χρησιμοποιείται το ContentResolver.persistedUriPermissions.
Ο χρήστης μπορεί να ανακαλέσει τις αποθηκευμένες άδειες μέσω Ρυθμίσεις → Εφαρμογές → Άδειες. Η εφαρμογή πρέπει να χειρίζεται το σενάριο όταν η πρόσβαση στο αρχείο εξαφανίζεται απροσδόκητα. Συνιστάται ο έλεγχος πρόσβασης μέσω ContentResolver.openInputStream πριν από την έναρξη εργασίας και η σωστή διαχείριση του SecurityException.
Το SAF εκκινείται μέσω τυπικού Intent. Ο κώδικας είναι ελάχιστος: δημιουργήστε ένα Intent με ACTION_OPEN_DOCUMENT, καθορίστε τους τύπους MIME και εκκινήστε μέσω ActivityResultContracts.StartActivityForResult. Μετά την επιλογή αρχείου, η callback λαμβάνει το URI στο data.data, το οποίο στη συνέχεια χρησιμοποιείται για ανάγνωση.
val pickFile = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
result.data?.data?.let { uri ->
val inputStream = contentResolver?.openInputStream(uri)
// read from inputStream
}
}
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
setType("application/pdf")
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
pickFile.launch(intent)
Για εγγραφή νέου αρχείου χρησιμοποιήστε το ACTION_CREATE_DOCUMENT. Το Intent δέχεται τον τύπο MIME και το όνομα αρχείου μέσω EXTRA_TITLE. Μετά την επιλογή φακέλου και επιβεβαίωση, ο χρήστης επιστρέφει ένα URI όπου η εφαρμογή γράφει δεδομένα μέσω ContentResolver.openOutputStream. Το σύστημα δημιουργεί αυτόματα το αρχείο στην επιλεγμένη τοποθεσία.
Το SAF διαφέρει από το παραδοσιακό READ_EXTERNAL_STORAGE με θεμελιωδώς διαφορετική προσέγγιση στην ασφάλεια. Αντί να ζητά πρόσβαση σε ολόκληρο τον αποθηκευτικό χώρο "με τη μία", το SAF ζητά πρόσβαση μόνο σε ένα συγκεκριμένο αρχείο. Αυτό ελαχιστοποιεί την επιφάνεια επίθεσης και αυξάνει την εμπιστοσύνη του χρήστη.
Το READ_EXTERNAL_STORAGE παρέχει πρόσβαση σε όλα τα αρχεία στη συσκευή, συμπεριλαμβανομένων φωτογραφιών και εγγράφων άλλων εφαρμογών. Σε Android 10+ αυτή η προσέγγιση είναι περιορισμένη. Το SAF, αντίθετα, παρέχει πρόσβαση μόνο στο αρχείο που επέλεξε ο χρήστης και απαιτεί ρητή επιβεβαίωση για κάθε αρχείο. Για μαζική εργασία με πολυμέσα χρησιμοποιήστε το MediaStore, για μεμονωμένα έγγραφα — το SAF.
Το κύριο μειονέκτημα του SAF είναι η ανάγκη επιλογής κάθε αρχείου ξεχωριστά. Για μαζικές λειτουργίες (δημιουργία αντιγράφων ασφαλείας, συγχρονισμός φακέλων) χρησιμοποιείται το ACTION_OPEN_DOCUMENT_TREE, το οποίο παρέχει πρόσβαση σε όλα τα αρχεία στον επιλεγμένο κατάλογο. Η λύση εξαρτάται από το σενάριο: το SAF είναι βέλτιστο για επιλογή από τον χρήστη, το MediaStore — για προγραμματιστική πρόσβαση σε πολυμέσα.
Συχνές ερωτήσεις
Storage Access Framework — είναι ένα πλαίσιο Android για ασφαλή πρόσβαση σε αρχεία μέσω του συστήματος διαλόγου επιλογής. Η εφαρμογή λαμβάνει content URI στο επιλεγμένο αρχείο χωρίς να ζητά ευρείες άδειες ανάγνωσης αποθηκευτικού χώρου.
Δημιουργήστε ένα Intent με ACTION_OPEN_DOCUMENT, καθορίστε τον τύπο MIME μέσω setType και εκκινήστε μέσω ActivityResultContracts. Στην callback λάβετε το URI από το data.data και διαβάστε μέσω ContentResolver.openInputStream.
Persistent URI permissions — είναι ο μηχανισμός διατήρησης πρόσβασης στο URI μετά από επανεκκίνηση της εφαρμογής. Ζητείται μέσω της σημαίας FLAG_GRANT_PERSISTABLE_URI_PERMISSION και της μεθόδου takePersistableUriPermission.
Το SAF υποστηρίζει οποιουσδήποτε τύπους MIME: application/pdf, image/*, text/plain, application/zip και άλλους. Οι τύποι καθορίζονται μέσω Intent.putExtra με τον πίνακα EXTRA_MIME_TYPES.
Το SAF προορίζεται για επιλογή μεμονωμένων αρχείων από τον χρήστη μέσω συστήματος διαλόγου. Το MediaStore παρέχει προγραμματιστική πρόσβαση σε όλα τα αρχεία πολυμέσων της συσκευής μέσω της βάσης δεδομένων πολυμέσων χωρίς συμμετοχή του χρήστη.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης