Η εξωτερική αποθήκευση σε κινητές συσκευές είναι ένα αφαιρούμενο μέσο δεδομένων στο οποίο μπορεί να έχει πρόσβαση οποιαδήποτε εφαρμογή με τα κατάλληλα δικαιώματα. Σύμφωνα με το Android Open Source Project, 2026, από το Android 10 η Google εισήγαγε το Scoped Storage — ένα μοντέλο που περιορίζει την άμεση πρόσβαση στο σύστημα αρχείων και απαιτεί τη χρήση του MediaStore API για εργασία με κοινά αρχεία πολυμέσων. Αυτή η προσέγγιση αυξάνει την ασφάλεια των δεδομένων των χρηστών και αποτρέπει τη διαρροή πληροφοριών μεταξύ εφαρμογών.
Βασικά σημεία
READ_EXTERNAL_STORAGE και WRITE_EXTERNAL_STORAGE είναι υποχρεωτικά για Android 9 και παλαιότερες εκδόσειςΕξωτερική αποθήκευση είναι μια περιοχή μνήμης που δεν ανήκει στο προστατευμένο περιβάλλον απομόνωσης της εφαρμογής και είναι προσβάσιμη από άλλα προγράμματα. Στο Android, ο όρος αυτός συνήθως αναφέρεται σε κάρτα SD, αλλά στην εξωτερική αποθήκευση περιλαμβάνονται επίσης οι μονάδες USB που συνδέονται μέσω προσαρμογέα OTG και οι υπηρεσίες cloud που είναι ενσωματωμένες σε επίπεδο συστήματος αρχείων. Η κύρια διαφορά από την εσωτερική αποθήκευση είναι η έλλειψη απομόνωσης: τα αρχεία στην εξωτερική αποθήκευση μπορούν να διαβαστούν και να τροποποιηθούν από οποιαδήποτε εφαρμογή που έχει τα κατάλληλα δικαιώματα.
Στο Android, η εξωτερική αποθήκευση παρουσιάζεται σε δύο βασικές λειτουργίες: φορητή (portable) και εσωτερική (adoptable). Κατά τη μορφοποίηση μιας κάρτας SD ως φορητής αποθήκευσης, παραμένει αφαιρούμενη και μορφοποιείται σε FAT32 ή exFAT. Στη λειτουργία adoptable storage, η κάρτα μορφοποιείται σε ext4 και κρυπτογραφείται με AES-128, μετά την οποία το σύστημα την αντιλαμβάνεται ως επέκταση της εσωτερικής μνήμης. Η λειτουργία adoptable είναι διαθέσιμη από το Android 6.0 Marshmallow, αλλά οι κατασκευαστές συσκευών συχνά απενεργοποιούν αυτήν τη δυνατότητα στις δικές τους εκδόσεις λογισμικού. Σύμφωνα με στατιστικά του Google Play Console, μόνο περίπου το 12% των Android συσκευών υποστηρίζει adoptable storage, επομένως δεν συνιστάται να βασίζεστε αποκλειστικά στην επέκταση της εσωτερικής μνήμης μέσω κάρτας SD.
Στο iOS δεν υπάρχουν παραδοσιακές κάρτες SD. Η Apple χρησιμοποιεί κλειστή αρχιτεκτονική, όπου όλη η αποθήκευση βασίζεται στην εσωτερική μνήμη flash και το iCloud. Οι εξωτερικές μονάδες υποστηρίζονται μέσω θύρας Lightning ή USB-C, αλλά η πρόσβαση περιορίζεται στον διαχειριστή αρχείων Files και σε εφαρμογές που ενσωματώνονται με το Document Picker. Ο χρήστης αποφασίζει ποια αρχεία θα ανοίξει από εξωτερική πηγή — η εφαρμογή δεν μπορεί να σαρώσει τη συνδεδεμένη μονάδα χωρίς ρητή συγκατάθεση.
Η επιλογή εξωτερικού μέσου εξαρτάται από τις απαιτήσεις σε ταχύτητα, χωρητικότητα και φορητότητα. Διαφορετικοί τύποι μέσων έχουν διαφορετικά χαρακτηριστικά ταχύτητας, συστήματα αρχείων και σενάρια χρήσης σε εφαρμογές για κινητά.
| Τύπος μέσου | Μέγ. χωρητικότητα | Ταχύτητα ανάγνωσης | Σύστημα αρχείων |
|---|---|---|---|
| SD UHS-I | 2 TB | έως 104 MB/s | exFAT / FAT32 |
| SD UHS-II | 2 TB | έως 312 MB/s | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | έως 400 MB/s | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | έως 1000 MB/s | exFAT / APFS / NTFS |
Οι κάρτες SD ταξινομούνται ανά ταχύτητα εγγραφής: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) και V90 (90 MB/s). Για εγγραφή βίντεο 4K απαιτείται κάρτα τουλάχιστον U3 ή V30. Για εφαρμογές κινητών που εργάζονται με μεγάλα αρχεία πολυμέσων (επεξεργασία φωτογραφιών, μοντάζ βίντεο), συνιστάται η χρήση καρτών κλάσης U3 και άνω. Η ταχύτητα της κάρτας επηρεάζει άμεσα την απόδοση της εφαρμογής: η εγγραφή βίντεο 4K σε κάρτα Class 10 μπορεί να προκαλέσει απώλεια καρέ λόγω ανεπαρκούς εύρους ζώνης. Κατά την επιλογή κάρτας SD για την εφαρμογή σας, δώστε προσοχή όχι μόνο στην κλάση ταχύτητας αλλά και στην βαθμολογία Application Performance Class: οι A1 και A2 υποδεικνύουν ελάχιστη απόδοση τυχαίας ανάγνωσης και εγγραφής, κρίσιμη για τη λειτουργία βάσεων δεδομένων και προσωρινής μνήμης εφαρμογών.
USB-OTG (On-The-Go) επιτρέπει τη σύνδεση εξωτερικών μονάδων USB σε κινητή συσκευή μέσω προσαρμογέα. Το Android υποστηρίζει OTG από την έκδοση 3.1, αλλά για την προσάρτηση της μονάδας απαιτείται πυρήνας με υποστήριξη του συστήματος αρχείων. Τα FAT32 και exFAT υποστηρίζονται άμεσα, το NTFS — μόνο σε συσκευές με προσαρμοσμένο πυρήνα ή μέσω της βιβλιοθήκης Paragon. Στο iOS, η υποστήριξη μονάδων USB εμφανίστηκε στο iOS 13 μαζί με την εφαρμογή Files. Για εργασία με τη μονάδα, η εφαρμογή πρέπει να χρησιμοποιεί το UIDocumentPickerViewController, το οποίο παρέχει πρόσβαση μόνο στα αρχεία που έχει επιλέξει ο χρήστης — το iOS δεν παρέχει πλήρη πρόσβαση στο σύστημα αρχείων της μονάδας.
Οι υπηρεσίες cloud — iCloud, Google Drive, Dropbox — μπορούν να ενσωματωθούν στο σύστημα αρχείων της συσκευής μέσω παρόχων συστήματος. Στο iOS, το iCloud Drive αποτελεί μέρος του Sandbox περιβάλλοντος της εφαρμογής και τα αρχεία συγχρονίζονται αυτόματα μεταξύ των συσκευών του χρήστη. Στο Android, το Google Drive παρέχει API για ανάγνωση και εγγραφή αρχείων, αλλά δεν γίνεται άμεση προσάρτηση στο σύστημα αρχείων. Για εφαρμογές κινητών που εργάζονται με μεγάλους όγκους δεδομένων, η αποθήκευση cloud μπορεί να αποτελέσει εναλλακτική λύση για την κάρτα SD, ειδικά σε συσκευές χωρίς υποδοχή επέκτασης.
Η εργασία με εξωτερική αποθήκευση σε Android εξαρτάται από την έκδοση του λειτουργικού συστήματος και το μοντέλο Scoped Storage. Η διαδικασία πρόσβασης σε αρχεία διαφέρει για Android 9 και παλαιότερα, Android 10–12 και Android 13+.
Από Android 10, ο κύριος τρόπος πρόσβασης σε κοινά αρχεία πολυμέσων είναι το MediaStore API. Αυτό το API παρέχει μια ενοποιημένη διεπαφή για ανάγνωση και εγγραφή εικόνων, βίντεο και αρχείων ήχου στον κοινό χώρο αποθήκευσης. Η εφαρμογή δεν απαιτεί άδεια READ_EXTERNAL_STORAGE για πρόσβαση στα δικά της αρχεία, αλλά για ανάγνωση αρχείων άλλων εφαρμογών εξακολουθεί να χρειάζεται ρητή άδεια χρήστη. Το MediaStore ευρετηριάζει αυτόματα τα αρχεία πολυμέσων και παρέχει ContentResolver για την αναζήτησή τους.
val collection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else {
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME
)
val cursor = contentResolver.query(collection, projection, null, null, null)
Μετά την εκτέλεση του ερωτήματος, λαμβάνετε ένα Cursor που περιέχει τα URI των αρχείων. Για ανάγνωση του αρχείου, ανοίξτε ένα InputStream μέσω contentResolver.openInputStream(uri). Η εγγραφή γίνεται παρόμοια μέσω contentResolver.openOutputStream(uri). Το MediaStore διαχειρίζεται αυτόματα τις διενέξεις ονομάτων και παρέχει δυνατότητα εισαγωγής νέων αρχείων μέσω contentResolver.insert(uri, values), το οποίο επιστρέφει το URI του δημιουργημένου αρχείου.
Storage Access Framework (SAF) — ο συνιστώμενος τρόπος πρόσβασης σε αυθαίρετα αρχεία σε Android 10+. Το SAF παρέχει έναν διάλογο επιλογής αρχείων συστήματος, μέσω του οποίου ο χρήστης δίνει στην εφαρμογή πρόσβαση σε ένα συγκεκριμένο αρχείο ή κατάλογο. Η εφαρμογή λαμβάνει ένα URI πρόσβασης που ισχύει μέχρι την επανεκκίνηση της συσκευής ή μέχρι την ανάκληση της άδειας μέσω ρυθμίσεων. Το SAF δεν απαιτεί άδειες READ_EXTERNAL_STORAGE ή WRITE_EXTERNAL_STORAGE, γεγονός που απλοποιεί τη δημοσίευση στο Google Play και μειώνει τον αριθμό των αιτημάτων αδειών.
val requestCode = 42
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
startActivityForResult(intent, requestCode)
Στο iOS, η εργασία με εξωτερικά αρχεία γίνεται μέσω του UIDocumentPickerViewController, το οποίο ο χρήστης ανοίγει για να επιλέξει συγκεκριμένα αρχεία ή καταλόγους. Η εφαρμογή δεν έχει άμεση πρόσβαση στο σύστημα αρχείων της εξωτερικής μονάδας — μόνο σε εκείνα τα αρχεία που έχει επιλέξει ρητά ο χρήστης. Μετά την επιλογή του αρχείου, η εφαρμογή λαμβάνει μια προσωρινή διεύθυνση URL στο Sandbox περιβάλλον και μπορεί να εργαστεί με το αρχείο μέσω του FileManager.
UIDocumentPickerViewController επιτρέπει στον χρήστη να επιλέξει ένα ή περισσότερα αρχεία από οποιαδήποτε διαθέσιμη πηγή: iCloud Drive, συνδεδεμένη μονάδα USB, υπηρεσία cloud τρίτου μέρους. Μετά την επιλογή, ο controller επιστρέφει μια συστοιχία διευθύνσεων URL που η εφαρμογή μπορεί να διαβάσει κατά τη διάρκεια της συνεδρίας. Για να διατηρήσετε την πρόσβαση μετά το κλείσιμο της εφαρμογής, πρέπει να καλέσετε το startAccessingSecurityScopedResource() και να αποθηκεύσετε έναν σελιδοδείκτη security-scoped στο UserDefaults.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.data, .image],
asCopy: true
)
picker.delegate = self
func documentPicker(
controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
let data = try Data(contentsOf: url)
}
Η παράμετρος asCopy: true σημαίνει ότι το iOS θα αντιγράψει το αρχείο στο Sandbox περιβάλλον της εφαρμογής και η εφαρμογή θα λάβει ένα δικό της αντίγραφο, ανεξάρτητο από το αρχικό αρχείο. Εάν ορίσετε asCopy: false, η εφαρμογή λαμβάνει μια αναφορά στο πρωτότυπο αρχείο, αλλά για πρόσβαση σε αυτό πρέπει να καλέσετε url.startAccessingSecurityScopedResource(). Χωρίς αυτήν την κλήση, η ανάγνωση του αρχείου θα προκαλέσει εξαίρεση. Μετά την ολοκλήρωση της εργασίας με το αρχείο, καλέστε url.stopAccessingSecurityScopedResource() για να κλείσετε τον πόρο και να αποτρέψετε διαρροή περιγραφέων.
Η ασφάλεια της εξωτερικής αποθήκευσης είναι χαμηλότερη από αυτήν της εσωτερικής, καθώς τα αρχεία είναι προσβάσιμα από άλλες εφαρμογές. Οποιαδήποτε εφαρμογή με άδεια READ_EXTERNAL_STORAGE μπορεί να διαβάσει όλα τα αρχεία στην κάρτα SD, συμπεριλαμβανομένων εκείνων που η εφαρμογή σας δημιούργησε για προσωρινή αποθήκευση ευαίσθητων δεδομένων. Μια κακόβουλη εφαρμογή μπορεί να σαρώσει την κάρτα SD και να εξάγει δεδομένα χρήστη, εάν δεν είναι κρυπτογραφημένα. Επομένως, δεν συνιστάται αυστηρά η αποθήκευση διακριτικών ταυτοποίησης, κωδικών πρόσβασης ή προσωπικών δεδομένων χρήστη σε εξωτερική αποθήκευση χωρίς κρυπτογράφηση.
Σε Android 10+, το Scoped Storage περιορίζει σημαντικά τις δυνατότητες των εφαρμογών για πρόσβαση στο κοινό σύστημα αρχείων. Η εφαρμογή μπορεί χωρίς άδεια να διαβάζει μόνο αρχεία που έχει δημιουργήσει η ίδια, ενώ για πρόσβαση σε αρχεία άλλων εφαρμογών απαιτείται ρητή συγκατάθεση του χρήστη μέσω διαλόγου SAF. Ωστόσο, αυτός ο περιορισμός δεν ισχύει για εφαρμογές με έκδοση-στόχο SDK κάτω από 29 — αυτές συνεχίζουν να λειτουργούν με το παλιό μοντέλο, δημιουργώντας κίνδυνο για χρήστες που δεν έχουν ενημερώσει τις εφαρμογές τους. Το Google Play από το 2021 απαιτεί targetSdkVersion 29+ για όλες τις νέες και ενημερωμένες εφαρμογές.
Μορφοποίηση και κρυπτογράφηση — μια ακόμη σημαντική πτυχή ασφάλειας. Η κάρτα SD που έχει μορφοποιηθεί ως φορητός χώρος αποθήκευσης δεν κρυπτογραφείται από το σύστημα από προεπιλογή. Ακόμη και με τη χρήση adoptable storage, η κρυπτογράφηση ενεργοποιείται μόνο εάν ο κατασκευαστής της συσκευής έχει συμπεριλάβει αυτήν τη δυνατότητα στο λογισμικό. Για προστασία ευαίσθητων δεδομένων που αποθηκεύονται σε εξωτερική αποθήκευση, χρησιμοποιήστε τη βιβλιοθήκη EncryptedFile από το AndroidX Security, η οποία κρυπτογραφεί κάθε αρχείο ξεχωριστά χρησιμοποιώντας AES256-GCM, ανεξάρτητα από την κρυπτογράφηση συστήματος.
Η αποτελεσματική χρήση εξωτερικής αποθήκευσης απαιτεί ισορροπία μεταξύ διαθεσιμότητας δεδομένων και ασφάλειας. Ακολουθήστε τους παρακάτω κανόνες για να εξασφαλίσετε αξιόπιστη αποθήκευση αρχείων χρήστη.
Environment.getExternalStorageState() για να ελέγξετε την κατάσταση της κάρτας SD. Η κάρτα μπορεί να έχει αφαιρεθεί, να έχει υποστεί βλάβη ή να μην είναι διαθέσιμη για εγγραφήΕίναι σημαντικό να θυμάστε ότι η εξωτερική αποθήκευση δεν εγγυάται την ασφάλεια των δεδομένων σε περίπτωση βλάβης. Οι κάρτες SD έχουν περιορισμένο αριθμό κύκλων εγγραφής, ειδικά τα οικονομικά μοντέλα Class 4 και Class 6. Σε περίπτωση έντονης εγγραφής (π.χ. καταγραφή ή προσωρινή αποθήκευση δεδομένων ροής), η κάρτα μπορεί να καταστραφεί μέσα σε λίγους μήνες. Για τέτοια σενάρια, χρησιμοποιήστε εσωτερική μνήμη ή αποθήκευση cloud, ενώ στην εξωτερική αποθήκευση αποθηκεύετε μόνο αρχεία των οποίων η απώλεια θεωρείται αποδεκτή από τον χρήστη. Ελέγχετε τακτικά την κατάσταση της κάρτας SD μέσω StatFs και ενημερώνετε τον χρήστη για κρίσιμα σφάλματα συστήματος αρχείων.
Συχνές ερωτήσεις
Σε Android 13+ η άδεια READ_EXTERNAL_STORAGE έχει αντικατασταθεί από πιο λεπτομερείς: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO και READ_MEDIA_AUDIO. Για πρόσβαση σε άλλους τύπους αρχείων χρησιμοποιήστε το SAF.
Ναι, η λειτουργία adoptable storage είναι διαθέσιμη σε Android 6.0+. Η κάρτα μορφοποιείται σε ext4 με κρυπτογράφηση AES-128. Ωστόσο, πολλοί κατασκευαστές απενεργοποιούν αυτήν την επιλογή, και περίπου το 88% των συσκευών δεν υποστηρίζουν adoptable storage.
Χρησιμοποιήστε τη μέθοδο Environment.getExternalStorageState(), η οποία επιστρέφει μια συμβολοσειρά κατάστασης. Η τιμή MEDIA_MOUNTED σημαίνει ότι η κάρτα είναι διαθέσιμη για ανάγνωση και εγγραφή. Άλλες τιμές υποδεικνύουν σφάλματα ή απουσία κάρτας.
Scoped Storage περιορίζει την εφαρμογή στο δικό της περιβάλλον και στις κοινές βιβλιοθήκες πολυμέσων MediaStore. Η πλήρης πρόσβαση επιτρέπει την ανάγνωση οποιωνδήποτε αρχείων στη συσκευή. Το Scoped Storage αυξάνει την ασφάλεια των δεδομένων χρήστη και είναι υποχρεωτικό για νέες εφαρμογές.
Εκκινήστε ένα Intent με την ενέργεια ACTION_OPEN_DOCUMENT_TREE, η οποία ανοίγει τον διάλογο επιλογής καταλόγου συστήματος. Μετά την επιλογή, θα λάβετε ένα URI-δικαίωμα που ισχύει μέχρι την επανεκκίνηση. Αποθηκεύστε αυτό το URI στο SharedPreferences για μελλοντική χρήση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης