MediaStore API — είναι η διεπαφή Android για πρόσβαση στα κοινά αρχεία πολυμέσων της συσκευής: εικόνες, βίντεο, ήχος και έγγραφα. Σε αντίθεση με την άμεση πρόσβαση σε αρχεία, το MediaStore λειτουργεί μέσω μιας κεντρικοποιημένης βάσης δεδομένων πολυμέσων και ενός παρόχου περιεχομένου. Σύμφωνα με το Android Developers Documentation (2025), από το Android 10 το API έγινε ο κύριος μηχανισμός εργασίας με πολυμέσα αντί του ξεπερασμένου READ_EXTERNAL_STORAGE. Οι προγραμματιστές χρησιμοποιούν το MediaStore σε γκαλερί, προγράμματα αναπαραγωγής μουσικής, κάμερες και διαχειριστές αρχείων.
Κύρια σημεία
MediaStore API — είναι ένας πάροχος περιεχομένου συστήματος στην πλατφόρμα Android, σχεδιασμένος για ευρετηρίαση, αποθήκευση και παροχή πρόσβασης σε αρχεία πολυμέσων της συσκευής. Το API αποτελεί μέρος του Android SDK και είναι διαθέσιμο από το API Level 1.
Το MediaStore λειτουργεί μέσω μιας ενιαίας βάσης δεδομένων πολυμέσων που σαρώνει αυτόματα τη συσκευή και συλλέγει μεταδεδομένα όλων των αρχείων πολυμέσων. Η βάση δεδομένων ενημερώνεται από το σύστημα κατά την προσθήκη, τροποποίηση ή διαγραφή αρχείων, έτσι οι εφαρμογές λαμβάνουν πάντα ενημερωμένες πληροφορίες χωρίς χειροκίνητη σάρωση.
Οι κύριοι πίνακες του MediaStore: Images (εικόνες), Video (βίντεο), Audio (ήχος) και Files (γενικά αρχεία). Κάθε πίνακας περιέχει στήλες με μεταδεδομένα: όνομα, ημερομηνία δημιουργίας, μέγεθος, τύπο MIME, συντεταγμένες GPS και άλλα χαρακτηριστικά.
Πριν από το Android 10, οι προγραμματιστές χρησιμοποιούσαν το READ_EXTERNAL_STORAGE για πρόσβαση σε όλα τα αρχεία της συσκευής. Android 10 (API 29) εισήγαγε το Scoped Storage: οι εφαρμογές απέκτησαν πρόσβαση μόνο στα δικά τους αρχεία και μέσω MediaStore. Το Android 11 ενίσχυσε την πολιτική, αποκλείοντας εντελώς την άμεση διαδρομή προς κοινόχρηστους καταλόγους.
Από Android 13 (API 33), η Google αντικατέστησε το READ_EXTERNAL_STORAGE με λεπτομερείς άδειες: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO και READ_MEDIA_AUDIO. Αυτό επιτρέπει στον χρήστη να παρέχει πρόσβαση μόνο σε συγκεκριμένους τύπους πολυμέσων χωρίς να αποκαλύπτει ολόκληρο τον αποθηκευτικό χώρο.
MediaStore είναι χτισμένο στην αρχιτεκτονική παρόχου περιεχομένου: κάθε εφαρμογή έχει πρόσβαση σε αυτό μέσω ContentResolver και Uri. Ο σαρωτής πολυμέσων συστήματος — MediaScannerConnection — ευρετηριάζει αυτόματα όλα τα αρχεία στη συσκευή κατά την εκκίνηση, σύνδεση USB ή επανεκκίνηση.
Η βάση δεδομένων πολυμέσων αποθηκεύεται στη βάση δεδομένων συστήματος και περιέχει εγγραφές για κάθε αρχείο πολυμέσων. Οι στήλες διαφέρουν για διαφορετικούς τύπους: οι εικόνες έχουν ORIENTATION και DATE_TAKEN, τα βίντεο — DURATION, ο ήχος — ARTIST και ALBUM. Οι προγραμματιστές μπορούν να εκτελούν SQL-όμοια ερωτήματα μέσω query με projection και selection για φιλτράρισμα.
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED
)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.Media.DATE_ADDED + " DESC"
)
cursor?.use {
while (moveToNext()) {
val name = getString(getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))
}
}
Κάθε αρχείο πολυμέσων αναγνωρίζεται από ένα Content URI της μορφής content://media/external/images/media/1234. Το εξωτερικό URI (external) αναφέρεται στον κοινόχρηστο αποθηκευτικό χώρο, το εσωτερικό (internal) — στα αρχεία πολυμέσων συστήματος. Η χρήση URI αντί για διαδρομές αρχείων — βασικό πλεονέκτημα του MediaStore: η εφαρμογή δεν απαιτεί πρόσβαση στο σύστημα αρχείων και λειτουργεί μέσω ασφαλούς παρόχου περιεχομένου.
MediaStore υποστηρίζει τέσσερις κύριους τύπους πολυμέσων, ο καθένας με ξεχωριστό πίνακα και σύνολο μεταδεδομένων. Οι προγραμματιστές επιλέγουν τον κατάλληλο πίνακα ανάλογα με τον τύπο περιεχομένου με τον οποίο εργάζεται η εφαρμογή.
Εκτός από τις τυπικές στήλες, κάθε πίνακας περιέχει πεδία συστήματος: _ID, DATA (ξεπερασμένο), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED. Από την έκδοση Android 10, το πεδίο DATA έχει επισημανθεί ως deprecated και οι προγραμματιστές πρέπει να εργάζονται μέσω ανοίγματος InputStream βάσει URI.
MediaStore απαιτεί ρητές άδειες που διαφέρουν ανάλογα με την έκδοση Android. Πριν από το Android 13 χρησιμοποιείτο η ενιαία άδεια READ_EXTERNAL_STORAGE. Από Android 13 (API 33), η Google εισήγαγε λεπτομερείς άδειες για κάθε τύπο πολυμέσων.
| Τύπος πολυμέσων | Άδεια (API 33+) | Παλιά (API 29-32) |
|---|---|---|
| Εικόνες | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| Βίντεο | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| Ήχος | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| Εγγραφή | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
Η εγγραφή στο MediaStore απαιτεί επίσης WRITE_EXTERNAL_STORAGE για Android 9 και παλαιότερα. Από Android 10, η εφαρμογή μπορεί να γράφει τα δικά της αρχεία στο MediaStore χωρίς πρόσθετες άδειες — το σύστημα παρέχει αυτόματα πρόσβαση κατά την εισαγωγή εγγραφής μέσω ContentResolver.insert.
Οι άδειες MediaStore ζητούνται μέσω του τυπικού μηχανισμού ActivityResultContracts.RequestMultiplePermissions. Ο χρήστης μπορεί να απορρίψει το αίτημα και η εφαρμογή πρέπει να χειριστεί σωστά αυτό το σενάριο. Συνιστάται ο έλεγχος ύπαρξης άδειας μέσω ContextCompat.checkSelfPermission πριν από κάθε πρόσβαση στο MediaStore.
MediaStore επιτρέπει όχι μόνο ανάγνωση, αλλά και εγγραφή αρχείων πολυμέσων. Για εγγραφή εικόνας ή βίντεο, ο προγραμματιστής χρησιμοποιεί ContentResolver.insert και ανοίγει OutputStream στο επιστρεφόμενο URI. Το σύστημα προσθέτει αυτόματα το αρχείο στη βάση δεδομένων πολυμέσων και το ευρετηριάζει.
val values = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, "photo_2025.jpg")
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
}
val uri = contentResolver?.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
)
uri?.let {
val outputStream = contentResolver?.openOutputStream(it)
outputStream?.use { stream ->
// εγγραφή byte στη ροή
}
}
Η διαγραφή γίνεται μέσω ContentResolver.delete με καθορισμό του URI του αρχείου. Το σύστημα ελέγχει τα δικαιώματα πρόσβασης: εάν το αρχείο ανήκει στην τρέχουσα εφαρμογή, η διαγραφή γίνεται χωρίς πρόσθετες άδειες. Για αρχεία άλλων εφαρμογών σε Android 10+ απαιτείται επιβεβαίωση χρήστη μέσω συστήματος διαλόγου.
MediaStore API διαφέρει θεμελιωδώς από την άμεση πρόσβαση σε αρχεία μέσω File API. Αντί για διαδρομές αρχείων χρησιμοποιούνται Content URI, και αντί για λειτουργίες αρχείων — μέθοδοι ContentResolver. Αυτό παρέχει τρία βασικά πλεονεκτήματα: ασφάλεια, αυτόματη ευρετηρίαση και ενοποιημένη διεπαφή.
Η άμεση πρόσβαση σε αρχεία είναι περιορισμένη σε Android 10+ για κοινόχρηστους καταλόγους. Το MediaStore παραμένει ο μοναδικός τρόπος ανάγνωσης πολυμέσων από Pictures, DCIM, Movies, Music και Download. Για τα δικά σας αρχεία εφαρμογής (app-specific storage) η άμεση πρόσβαση παραμένει — αυτοί είναι φάκελοι στο Android/data και Android/media.
Η επιλογή μεταξύ MediaStore και άμεσης πρόσβασης εξαρτάται από τον τύπο περιεχομένου. MediaStore είναι υποχρεωτικό για κοινά αρχεία πολυμέσων προσβάσιμα από άλλες εφαρμογές. Το άμεσο File API είναι κατάλληλο για εσωτερικά αρχεία εφαρμογής και προσωρινή μνήμη. Το Storage Access Framework χρησιμοποιείται για επιλογή αυθαίρετων εγγράφων μέσω του επιλογέα συστήματος.
Συχνές Ερωτήσεις
MediaStore API — είναι ο πάροχος περιεχομένου συστήματος Android για πρόσβαση σε αρχεία πολυμέσων της συσκευής: εικόνες, βίντεο, ήχο και έγγραφα. Το API παρέχει ενοποιημένη διεπαφή μέσω ContentResolver και βάσης δεδομένων πολυμέσων που ευρετηριάζει αυτόματα όλα τα αρχεία.
Το MediaStore υποστηρίζει Images (εικόνες), Video (βίντεο), Audio (ήχο) και Files (έγγραφα). Κάθε τύπος έχει ξεχωριστό πίνακα με δικό του σύνολο μεταδεδομένων: οι εικόνες έχουν ORIENTATION, τα βίντεο — DURATION, ο ήχος — ARTIST.
Σε Android 13+ χρησιμοποιούνται λεπτομερείς άδειες: READ_MEDIA_IMAGES για εικόνες, READ_MEDIA_VIDEO για βίντεο και READ_MEDIA_AUDIO για ήχο. Ο χρήστης μπορεί να παρέχει πρόσβαση μόνο σε συγκεκριμένους τύπους πολυμέσων.
Για εγγραφή, δημιουργήστε ένα ContentValues με όνομα και τύπο MIME, καλέστε το ContentResolver.insert για να λάβετε URI, στη συνέχεια ανοίξτε το OutputStream μέσω ContentResolver.openOutputStream. Το σύστημα ευρετηριάζει αυτόματα το νέο αρχείο.
MediaStore παρέχει προγραμματική πρόσβαση σε όλα τα αρχεία πολυμέσων της συσκευής μέσω της βάσης δεδομένων πολυμέσων. Storage Access Framework ανοίγει ένα παράθυρο διαλόγου συστήματος για επιλογή αρχείου και επιστρέφει URI — ο χρήστης επιλέγει ένα συγκεκριμένο αρχείο ή φάκελο.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης