Storage Access Framework: τι είναι, αρχές λειτουργίας και πρόσβαση σε αρχεία

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

Storage Access Framework — είναι ένα πλαίσιο Android για ασφαλή πρόσβαση σε αρχεία και έγγραφα μέσω του συστήματος διαλόγου επιλογής. Αντί να ζητά ευρείες άδειες ανάγνωσης αποθηκευτικού χώρου, η εφαρμογή λαμβάνει έναν σύνδεσμο URI στο αρχείο που επέλεξε ο χρήστης. Σύμφωνα με τους Android Developers (2026), το SAF υποστηρίζει τοπικό αποθηκευτικό χώρο, υπηρεσίες cloud Google Drive και Dropbox μέσω του DocumentProvider. Το πλαίσιο εισήχθη στο Android 4.4 και έγινε το πρότυπο εργασίας με έγγραφα ξεκινώντας από το Android 10.

Κύρια σημεία

  • SAF — πλαίσιο Android για επιλογή αρχείων μέσω συστήματος διαλόγου χωρίς ευρείες άδειες.
  • Σύνδεσμος URI αντικαθιστά την άμεση διαδρομή αρχείου: η εφαρμογή εργάζεται με το αρχείο μέσω content URI.
  • Persistent permissions επιτρέπουν τη διατήρηση πρόσβασης στο αρχείο μετά από επανεκκίνηση της εφαρμογής.
  • DocumentProvider επεκτείνει το SAF για πρόσβαση σε cloud και προσαρμοσμένους αποθηκευτικούς χώρους.
  • Android 10 κατέστησε το SAF υποχρεωτικό για πρόσβαση σε αρχεία εκτός του sandbox της εφαρμογής.

Τι είναι το Storage Access Framework;

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: επιλογέας συστήματος και URI

Το 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 πρόσβασης

Από προεπιλογή, το URI είναι έγκυρο μέχρι την επανεκκίνηση της εφαρμογής ή την επανεκκίνηση της συσκευής. Για μακροπρόθεσμη πρόσβαση, η εφαρμογή ζητά takePersistableUriPermission — αυτό επιτρέπει την ανάγνωση του αρχείου σε επόμενες εκκινήσεις χωρίς εκ νέου επιλογή μέσω διαλόγου.

ACTION_OPEN_DOCUMENT και ACTION_CREATE_DOCUMENT

Το 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

Persistent URI permissions — μηχανισμός SAF που επιτρέπει τη διατήρηση πρόσβασης στο αρχείο μετά το τέλος της τρέχουσας συνεδρίας. Χωρίς αυτή τη σημαία, το URI είναι έγκυρο μόνο μέχρι την επανεκκίνηση της εφαρμογής. Η εφαρμογή ζητά τη σημαία FLAG_GRANT_PERSISTABLE_URI_PERMISSION μαζί με τις σημαίες READ και WRITE.

Για τη διατήρηση δικαιωμάτων χρησιμοποιείται η μέθοδος ContentResolver.takePersistableUriPermission. Το σύστημα αποθηκεύει το URI σε ειδικό μητρώο και αποκαθιστά την πρόσβαση κατά την επόμενη εκκίνηση της εφαρμογής. Για να ελέγξετε εάν η εφαρμογή έχει μόνιμη πρόσβαση στο URI, χρησιμοποιείται το ContentResolver.persistedUriPermissions.

Ο χρήστης μπορεί να ανακαλέσει τις αποθηκευμένες άδειες μέσω Ρυθμίσεις → Εφαρμογές → Άδειες. Η εφαρμογή πρέπει να χειρίζεται το σενάριο όταν η πρόσβαση στο αρχείο εξαφανίζεται απροσδόκητα. Συνιστάται ο έλεγχος πρόσβασης μέσω ContentResolver.openInputStream πριν από την έναρξη εργασίας και η σωστή διαχείριση του SecurityException.

Παραδείγματα κώδικα: επιλογή αρχείου μέσω SAF

Το SAF εκκινείται μέσω τυπικού Intent. Ο κώδικας είναι ελάχιστος: δημιουργήστε ένα Intent με ACTION_OPEN_DOCUMENT, καθορίστε τους τύπους MIME και εκκινήστε μέσω ActivityResultContracts.StartActivityForResult. Μετά την επιλογή αρχείου, η callback λαμβάνει το URI στο data.data, το οποίο στη συνέχεια χρησιμοποιείται για ανάγνωση.

kotlin
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

Για εγγραφή νέου αρχείου χρησιμοποιήστε το ACTION_CREATE_DOCUMENT. Το Intent δέχεται τον τύπο MIME και το όνομα αρχείου μέσω EXTRA_TITLE. Μετά την επιλογή φακέλου και επιβεβαίωση, ο χρήστης επιστρέφει ένα URI όπου η εφαρμογή γράφει δεδομένα μέσω ContentResolver.openOutputStream. Το σύστημα δημιουργεί αυτόματα το αρχείο στην επιλεγμένη τοποθεσία.

SAF vs READ_EXTERNAL_STORAGE

Το SAF διαφέρει από το παραδοσιακό READ_EXTERNAL_STORAGE με θεμελιωδώς διαφορετική προσέγγιση στην ασφάλεια. Αντί να ζητά πρόσβαση σε ολόκληρο τον αποθηκευτικό χώρο "με τη μία", το SAF ζητά πρόσβαση μόνο σε ένα συγκεκριμένο αρχείο. Αυτό ελαχιστοποιεί την επιφάνεια επίθεσης και αυξάνει την εμπιστοσύνη του χρήστη.

Το READ_EXTERNAL_STORAGE παρέχει πρόσβαση σε όλα τα αρχεία στη συσκευή, συμπεριλαμβανομένων φωτογραφιών και εγγράφων άλλων εφαρμογών. Σε Android 10+ αυτή η προσέγγιση είναι περιορισμένη. Το SAF, αντίθετα, παρέχει πρόσβαση μόνο στο αρχείο που επέλεξε ο χρήστης και απαιτεί ρητή επιβεβαίωση για κάθε αρχείο. Για μαζική εργασία με πολυμέσα χρησιμοποιήστε το MediaStore, για μεμονωμένα έγγραφα — το SAF.

Το κύριο μειονέκτημα του SAF είναι η ανάγκη επιλογής κάθε αρχείου ξεχωριστά. Για μαζικές λειτουργίες (δημιουργία αντιγράφων ασφαλείας, συγχρονισμός φακέλων) χρησιμοποιείται το ACTION_OPEN_DOCUMENT_TREE, το οποίο παρέχει πρόσβαση σε όλα τα αρχεία στον επιλεγμένο κατάλογο. Η λύση εξαρτάται από το σενάριο: το SAF είναι βέλτιστο για επιλογή από τον χρήστη, το MediaStore — για προγραμματιστική πρόσβαση σε πολυμέσα.

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

Τι είναι το Storage Access Framework στο Android;

Storage Access Framework — είναι ένα πλαίσιο Android για ασφαλή πρόσβαση σε αρχεία μέσω του συστήματος διαλόγου επιλογής. Η εφαρμογή λαμβάνει content URI στο επιλεγμένο αρχείο χωρίς να ζητά ευρείες άδειες ανάγνωσης αποθηκευτικού χώρου.

Πώς ανοίγω ένα αρχείο μέσω SAF;

Δημιουργήστε ένα Intent με ACTION_OPEN_DOCUMENT, καθορίστε τον τύπο MIME μέσω setType και εκκινήστε μέσω ActivityResultContracts. Στην callback λάβετε το URI από το data.data και διαβάστε μέσω ContentResolver.openInputStream.

Τι είναι τα persistent URI permissions;

Persistent URI permissions — είναι ο μηχανισμός διατήρησης πρόσβασης στο URI μετά από επανεκκίνηση της εφαρμογής. Ζητείται μέσω της σημαίας FLAG_GRANT_PERSISTABLE_URI_PERMISSION και της μεθόδου takePersistableUriPermission.

Ποιους τύπους MIME υποστηρίζει το SAF;

Το SAF υποστηρίζει οποιουσδήποτε τύπους MIME: application/pdf, image/*, text/plain, application/zip και άλλους. Οι τύποι καθορίζονται μέσω Intent.putExtra με τον πίνακα EXTRA_MIME_TYPES.

Σε τι διαφέρει το SAF από το MediaStore;

Το SAF προορίζεται για επιλογή μεμονωμένων αρχείων από τον χρήστη μέσω συστήματος διαλόγου. Το MediaStore παρέχει προγραμματιστική πρόσβαση σε όλα τα αρχεία πολυμέσων της συσκευής μέσω της βάσης δεδομένων πολυμέσων χωρίς συμμετοχή του χρήστη.

Σύνοψη

  • Storage Access Framework — πλαίσιο Android για ασφαλή πρόσβαση σε αρχεία μέσω επιλογέα συστήματος χωρίς ευρείες άδειες.
  • Content URI αντικαθιστά τις διαδρομές αρχείων: η εφαρμογή εργάζεται με το αρχείο μέσω DocumentProvider, όχι μέσω άμεσων συνδέσμων file://.
  • ACTION_OPEN_DOCUMENT ανοίγει ένα υπάρχον αρχείο, ACTION_CREATE_DOCUMENT δημιουργεί νέο, ACTION_OPEN_DOCUMENT_TREE επιλέγει φάκελο.
  • Persistent permissions διατηρούν πρόσβαση στο URI μετά από επανεκκίνηση της εφαρμογής μέσω takePersistableUriPermission.
  • Android 10 κατέστησε το SAF υποχρεωτικό για πρόσβαση σε αρχεία εκτός app-specific storage, περιορίζοντας το READ_EXTERNAL_STORAGE.
  • DocumentProvider επεκτείνει το SAF για ενσωμάτωση cloud και προσαρμοσμένων αποθηκευτικών χώρων.
  • Επιλογή μεταξύ SAF και MediaStore εξαρτάται από το σενάριο: SAF — για επιλογή από τον χρήστη, MediaStore — για προγραμματιστική πρόσβαση σε πολυμέσα.

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

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

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

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