MediaSession — στοιχείο του πλαισίου Android για τη διαχείριση αναπαραγωγής περιεχομένου πολυμέσων και ενσωμάτωση με εξωτερικές συσκευές. Παρέχει μια ενοποιημένη διεπαφή αλληλεπίδρασης με ακουστικά Bluetooth, ακουστικά, Android Auto και το κέντρο πολυμέσων του συστήματος. Σύμφωνα με τον Android Developers Guide, 2026, το MediaSession αντικαθιστά το παλαιωμένο RemoteControlClient και είναι υποχρεωτικό για προγράμματα αναπαραγωγής που συγχρονίζονται με το σύστημα.
Κύρια σημεία
MediaSession — είναι ένα στοιχείο συστήματος Android που επιτρέπει στην εφαρμογή να δηλώσει τη δραστηριότητα πολυμέσων της και να λαμβάνει εντολές ελέγχου από έξω. Όταν ο χρήστης πατά το κουμπί Play σε ένα ακουστικό Bluetooth, το σύστημα μεταφέρει αυτό το συμβάν στο ενεργό MediaSession και η εφαρμογή αντιδρά μέσω του Callback της.
Πριν από το Android 5.0, για αυτούς τους σκοπούς χρησιμοποιούνταν το RemoteControlClient, αλλά δεν παρείχε την απαραίτητη ευελιξία και δεν υποστήριζε σύγχρονα σενάρια — Android Auto, έξυπνα ρολόγια, έξυπνα ηχεία. Το MediaSession εισήχθη στο API 21 και έγινε το de facto πρότυπο για όλες τις εφαρμογές Android με αναπαραγωγή ήχου και βίντεο.
Σύμφωνα με την τεκμηρίωση Android Developer Documentation (2026), η εφαρμογή πρέπει να δημιουργεί ένα MediaSession για κάθε ανεξάρτητη πηγή αναπαραγωγής. Κάθε φορά μπορεί να υπάρχει μόνο μία ενεργή συνεδρία — κάθε νέα συνεδρία απενεργοποιεί αυτόματα την προηγούμενη.
Ο συνδυασμός MediaSession με MediaBrowserService παρέχει έναν πλήρη κύκλο διαχείρισης πολυμέσων: η υπηρεσία παρέχει ένα δέντρο περιεχομένου (λίστες αναπαραγωγής, κατάλογοι) και η συνεδρία λαμβάνει εντολές πλοήγησης και αναπαραγωγής. Αυτή είναι η αρχιτεκτονική που προτείνεται από την Google για μουσικές συσκευές αναπαραγωγής, podcast και ηχητικά βιβλία.
Το MediaBrowserService εκτελείται ως foreground-service με ειδοποίηση, που εγγυάται τη λειτουργία της εφαρμογής ακόμη και μετά τον τερματισμό του Activity. Αυτό είναι κρίσιμο για τις συσκευές αναπαραγωγής ήχου που πρέπει να συνεχίσουν την αναπαραγωγή όταν η εφαρμογή είναι ελαχιστοποιημένη.
Η συνεδρία υποστηρίζει δύο τύπους αλληλεπίδρασης: λαμβάνει εντολές από το MediaController (πλευρά πελάτη) και εκπέμπει κατάσταση μέσω του PlaybackState. Το MediaController μπορεί να βρίσκεται στην ίδια διεργασία ή σε ξεχωριστή εφαρμογή — το σύστημα δρομολογεί τα αιτήματα μέσω του SessionToken.
Όταν ο χρήστης καλεί τον φωνητικό βοηθό Android και λέει “Αναπαραγωγή επόμενου τραγουδιού”, το σύστημα βρίσκει το ενεργό MediaSession μέσω της σύνδεσης με το MediaBrowserService και στέλνει την εντολή ACTION_SKIP_TO_NEXT. Το Callback της εφαρμογής λαμβάνει την κλήση onSkipToNext() και ενημερώνει το PlaybackState.
Η ενημέρωση του PlaybackState μέσω setPlaybackState() ειδοποιεί αμέσως όλα τα συνδεδεμένα MediaController. Το κέντρο πολυμέσων συστήματος, η συσκευή Bluetooth και το Android Auto λαμβάνουν την ενημέρωση ταυτόχρονα — η καθυστέρηση δεν ξεπερνά τα 50 ms υπό κανονικές συνθήκες.
Το PlaybackState περιέχει βασικές σημαίες κατάστασης: isPlaying, θέση, ταχύτητα, διαθέσιμες ενέργειες (play, pause, seek, stop). Χωρίς σωστά συμπληρωμένο PlaybackState, το σύστημα δεν γνωρίζει ποιες εντολές υποστηρίζει η εφαρμογή και δεν στέλνει τα αντίστοιχα συμβάντα.
Τα μεταδεδομένα (MediaMetadata) συμπληρώνουν την κατάσταση με πληροφορίες για το τρέχον κομμάτι — title, artist, album art URI. Το Android Auto και οι φορητές συσκευές χρησιμοποιούν το MediaMetadata για την εμφάνιση πληροφοριών στην οθόνη. Σύμφωνα με το Google I/O 2024, η σωστή συμπλήρωση του MediaMetadata αυξάνει την ορατότητα της εφαρμογής σε εκκινητές τρίτων κατά 40%.
Η αρχιτεκτονική του MediaSession αποτελείται από τέσσερα αλληλένδετα στοιχεία, καθένα από τα οποία επιλύει τη δική του εργασία. Ο προγραμματιστής πρέπει να υλοποιήσει και τα τέσσερα για πλήρη ενσωμάτωση με το σύστημα.
Η συνεδρία δημιουργείται στο onCreate της υπηρεσίας ή Activity με κλήση MediaSessionCompat(context, tag). Μετά τη δημιουργία, πρέπει υποχρεωτικά να κληθεί setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS). Στο onDestroy καλείται release() για απελευθέρωση πόρων συστήματος.
Η λανθασμένη διαχείριση του κύκλου ζωής είναι ένα από τα συνηθισμένα λάθη. Εάν δεν κληθεί η release(), η συνεδρία παραμένει στο σύστημα και η επόμενη εφαρμογή μπορεί να λάβει ψευδή κατάσταση. Το Android 13+ εμφανίζει προειδοποίηση στο Logcat σε περίπτωση διαρροής συνεδρίας.
Η βασική ενσωμάτωση ξεκινά με τη δημιουργία συνεδρίας και την υλοποίηση Callback. Συνιστάται η χρήση MediaSessionCompat από τη βιβλιοθήκη AndroidX media, η οποία παρέχει ενιαίο API για όλες τις εκδόσεις Android — από API 14 έως 35.
class MusicService : Service() {
private lateinit var mediaSession: MediaSessionCompat
private lateinit var stateBuilder: PlaybackStateCompat.Builder
override fun onCreate() {
super.onCreate()
mediaSession = MediaSessionCompat(this, "MusicService")
mediaSession.setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)
mediaSession.setCallback(MediaSessionCallback())
updatePlaybackState(false)
}
private inner class MediaSessionCallback : MediaSessionCompat.Callback() {
override fun onPlay() {
updatePlaybackState(true)
}
override fun onPause() {
updatePlaybackState(false)
}
}
private fun updatePlaybackState(isPlaying: Boolean) {
stateBuilder = PlaybackStateCompat.Builder()
.setState(
if (isPlaying) PlaybackStateCompat.STATE_PLAYING
else PlaybackStateCompat.STATE_PAUSED,
AudioTrackCompat.CURRENT_POSITION_NOT_SET,
1.0f
)
.setActions(
PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PAUSE
or PlaybackStateCompat.ACTION_SKIP_TO_NEXT
or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
)
mediaSession.setPlaybackState(stateBuilder.build())
}
override fun onDestroy() {
mediaSession.release()
super.onDestroy()
}
}
Στο παράδειγμα, δημιουργείται ένα MediaSession με ετικέτα MusicService και σημαίες για επεξεργασία κουμπιών πολυμέσων. Το Callback υλοποιεί τα onPlay και onPause, ενημερώνοντας το PlaybackState. Η μέθοδος setActions δηλώνει τις διαθέσιμες ενέργειες που εμφανίζει το σύστημα στην οθόνη κλειδώματος και στο κέντρο πολυμέσων.
private fun setMetadata(title: String, artist: String) {
val metadata = MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, 300000L)
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, albumArtUrl)
.build()
mediaSession.setMetadata(metadata)
}
Τα μεταδεδομένα πρέπει να ενημερώνονται σε κάθε αλλαγή κομματιού. Το σύστημα χρησιμοποιεί τα METADATA_KEY_TITLE και METADATA_KEY_ARTIST για εμφάνιση πληροφοριών σε οθόνες Bluetooth αυτοκινήτων και φορητών συσκευών. Εάν δεν οριστεί URI εξωφύλλου, η συσκευή αναπαραγωγής θα εμφανίσει γκρι placeholder.
Τα ακουστικά Bluetooth στέλνουν εντολές μέσω του προφίλ AVRCP 1.6+. Το Android μεταδίδει αυτές τις εντολές σε intents ACTION_MEDIA_BUTTON, τα οποία αναχαιτίζονται από το MediaSession όταν έχει οριστεί η σημαία FLAG_HANDLES_MEDIA_BUTTONS.
Όταν ο χρήστης πατά το κουμπί Play στα ακουστικά Bluetooth, το σύστημα δημιουργεί ένα KeyEvent με κωδικό KEYCODE_MEDIA_PLAY, το οποίο αποστέλλεται στη μέθοδο onMediaButtonEvent του Callback. Εάν στο Callback έχει υλοποιηθεί η onPlay(), το σύστημα την καλεί απευθείας. Σε μονό πάτημα του κουμπιού στο ακουστικό, αποστέλλεται KEYCODE_MEDIA_PLAY_PAUSE — η συσκευή αναπαραγωγής πρέπει να αλλάξει κατάσταση.
Τα σύγχρονα ακουστικά Bluetooth μπορούν να έχουν έως 5 κουμπιά: ένταση +/-, play/pause, next, previous. Κάθε κουμπί παράγει το δικό του KeyEvent που πρέπει να υποβληθεί σε σωστή επεξεργασία από το Callback. Το διπλό πάτημα play/pause συνήθως ερμηνεύεται ως μετάβαση στο επόμενο κομμάτι (ACTION_SKIP_TO_NEXT) σε πολλά ακουστικά.
Σύμφωνα με το Android Compatibility Definition Document (2026), όλες οι εφαρμογές με περιεχόμενο πολυμέσων υποχρεούνται να επεξεργάζονται σωστά το KEYCODE_MEDIA_PLAY_PAUSE. Η αγνόηση αυτής της απαίτησης οδηγεί σε αυτόματη μείωση της βαθμολογίας της εφαρμογής στο Google Play για την κατηγορία Μουσική και Ήχος.
Από το Android 11, το κέντρο πολυμέσων συστήματος (Media Control Panel) εμφανίζει έως 5 πρόσφατες MediaSession στο πλαίσιο ειδοποιήσεων. Ο χρήστης μπορεί να ελέγχει τη συσκευή αναπαραγωγής χωρίς να ανοίγει την εφαρμογή. Για σωστή εμφάνιση, απαιτείται υλοποίηση MediaBrowserService και σωστή συμπλήρωση PlaybackState.
Το Media Control Panel εμφανίζει: τίτλο κομματιού, καλλιτέχνη, εξώφυλλο (από MediaMetadata), κουμπιά ελέγχου (από επιτρεπόμενες ενέργειες PlaybackState). Εάν η εφαρμογή δεν ενημερώνει το PlaybackState τουλάχιστον μία φορά κάθε 10 δευτερόλεπτα κατά την ενεργή αναπαραγωγή, το κέντρο πολυμέσων κρύβει τη συνεδρία από το πλαίσιο.
private fun startForegroundService() {
val notification = NotificationCompat.Builder(this, "media_channel")
.setSmallIcon(R.drawable.ic_play)
.setContentTitle("Τώρα παίζει")
.setContentText(currentTrackTitle)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSession.sessionToken)
)
.build()
startForeground(1001, notification)
}
Η ειδοποίηση MediaStyle συνδέεται με το MediaSession μέσω του sessionToken και εμφανίζει τυπικά κουμπιά πολυμέσων. Χωρίς MediaStyle, η ειδοποίηση θα μοιάζει με συνηθισμένη προειδοποίηση χωρίς κουμπιά ελέγχου. Το Android 13+ απαιτεί ρητή άδεια POST_NOTIFICATIONS για εμφάνιση.
Συχνές Ερωτήσεις
Τεχνικά ναι, αλλά κάθε φορά μόνο μία συνεδρία θεωρείται ενεργή. Κατά τη δημιουργία νέας συνεδρίας χωρίς κλήση setActive(true), η προηγούμενη παραμένει ενεργή. Συνιστάται μία συνεδρία ανά εφαρμογή ή ανά ανεξάρτητη πηγή ήχου με εναλλαγή ενεργής κατάστασης.
Το MediaSession δεν διαχειρίζεται αυτόματα το Audio Focus — αυτός είναι ξεχωριστός μηχανισμός. Κατά τη λήψη εντολής onPlay, ο προγραμματιστής ζητά προσωπικά AudioFocus μέσω AudioManager και κατά την απώλεια εστίασης διακόπτει την αναπαραγωγή μέσω της συνεδρίας.
Ελέγξτε τη ρύθμιση των σημαιών FLAG_HANDLES_MEDIA_BUTTONS και FLAG_HANDLES_TRANSPORT_CONTROLS. Επίσης, βεβαιωθείτε ότι η συνεδρία είναι ενεργή (setActive(true)). Σε Android 12+, τα κουμπιά πολυμέσων λειτουργούν μόνο μέσω MediaSession — ο παλαιός registerMediaButtonEventReceiver δεν υποστηρίζεται.
Για βασική επεξεργασία κουμπιών — όχι. Αλλά για ενσωμάτωση με Android Auto, Wear OS και το κέντρο πολυμέσων συστήματος, απαιτείται MediaBrowserService. Η Google συνιστά την υλοποίηση MediaBrowserService σε όλες τις εφαρμογές με μακροχρόνια αναπαραγωγή ήχου.
Χρησιμοποιήστε την εντολή adb shell dumpsys media_session για προβολή ενεργών συνεδριών, των Callback και PlaybackState τους. Το εργαλείο θα εμφανίσει όλες τις καταχωρημένες συνεδρίες με ετικέτα, δραστηριότητα και τελευταία γνωστή κατάσταση — βολικό εργαλείο για εντοπισμό σφαλμάτων.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης