Audio Focus — μηχανισμός Android που ρυθμίζει την ταυτόχρονη χρήση της εξόδου ήχου από πολλές εφαρμογές. Αποτρέπει την επικάλυψη ήχων: όταν μια εφαρμογή ξεκινά αναπαραγωγή, το σύστημα αυτόματα σιγά ή διακόπτει την άλλη. Σύμφωνα με τον Android Developer Guide, 2026, το Audio Focus είναι υποχρεωτικό για όλες τις εφαρμογές που αναπαράγουν ήχο — χωρίς αυτό το Google Play μπορεί να απορρίψει την ενημέρωση.
Κύρια σημεία
Audio Focus — είναι ένα κεντρικοποιημένο σύστημα διαιτησίας ήχου στο Android. Όταν μια εφαρμογή ζητά εστίαση, το σύστημα ελέγχει αν υπάρχει ενεργός «κάτοχος» εστίασης και του στέλνει ειδοποίηση απώλειας. Ο κάτοχος μπορεί είτε να μειώσει την ένταση (duck), είτε να διακόψει την αναπαραγωγή, είτε να αγνοήσει — ανάλογα με τον τύπο εστίασης.
Πριν από το Android 8.0, η εστίαση γινόταν μέσω AudioManager.requestAudioFocus(callback, stream, durationHint). Από το Android 8.0, εμφανίστηκε το AudioFocusRequest, το οποίο πρόσθεσε τη δυνατότητα καθορισμού τύπου αιτήματος και αυτόματης επαναφοράς εστίασης. Στο Android 12 ο μηχανισμός ενισχύθηκε — όλες οι συσκευές αναπαραγωγής πολυμέσων υποχρεούνται να διαχειρίζονται σωστά την εστίαση για δημοσίευση στο Google Play.
Σύμφωνα με το Google I/O 2024, περίπου το 15% των παραπόνων χρηστών σε κριτικές εφαρμογών ήχου σχετίζονται με επικάλυψη ήχων. Η σωστή υλοποίηση του Audio Focus λύνει αυτό το πρόβλημα και βελτιώνει την εμπειρία χρήστη κατά 30% όσον αφορά τον χρόνο ακρόασης.
Είναι σημαντικό να κατανοήσετε ότι το Audio Focus δεν διαχειρίζεται αυτόματα την αναπαραγωγή. Απλώς ειδοποιεί την εφαρμογή για γεγονότα εστίασης. Η εφαρμογή αποφασίζει μόνη της: να διακόψει τη συσκευή αναπαραγωγής, να μειώσει την ένταση ή να συνεχίσει. Το σύστημα δεν εξαναγκάζει — αυτή είναι μια αρχιτεκτονική απόφαση που αφήνεται στην κρίση του προγραμματιστή.
Εξαίρεση αποτελούν οι εφαρμογές πλοήγησης (Google Maps, Yandex.Maps). Μπορούν να ζητήσουν εστίαση τύπου AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, κατά την οποία η υπάρχουσα συσκευή αναπαραγωγής σιγάζεται και οι φωνητικές οδηγίες ακούγονται από πάνω. Μετά την ολοκλήρωση της οδηγίας, η συσκευή αναπαραγωγής επαναφέρει αυτόματα την ένταση.
Το σύστημα διατηρεί έναν μοναδικό ενεργό κάτοχο εστίασης ήχου. Κατά την αίτηση εστίασης από μια νέα εφαρμογή, το σύστημα καθορίζει προτεραιότητα και στέλνει συμβάν στον τρέχοντα κάτοχο. Εάν ο τρέχων κάτοχος αγνοήσει το συμβάν και συνεχίσει δυνατά, το σύστημα δεν επιβάλλει κυρώσεις — η ευθύνη βαρύνει εξ ολοκλήρου τη συσκευή αναπαραγωγής.
Το αίτημα εστίασης περιλαμβάνει την παράμετρο durationHint, η οποία ενημερώνει το σύστημα για την αναμενόμενη διάρκεια: AUDIOFOCUS_GAIN (μεγάλη διάρκεια — μουσική, podcast), AUDIOFOCUS_GAIN_TRANSIENT (σύντομη — ήχος ειδοποίησης, πλοήγηση), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (σύντομη με άδεια σίγασης της υπάρχουσας συσκευής αναπαραγωγής).
Κατά την απώλεια εστίασης, η εφαρμογή λαμβάνει έναν από τρεις κωδικούς: AUDIOFOCUS_LOSS (μακροχρόνια απώλεια — άλλη εφαρμογή ξεκίνησε μουσική), AUDIOFOCUS_LOSS_TRANSIENT (προσωρινή απώλεια — κλήση, ειδοποίηση), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (προσωρινή απώλεια με δυνατότητα σίγασης). Κάθε κωδικός απαιτεί δική του αντίδραση.
Ο χρήστης ακούει μουσική στην εφαρμογή A. Έρχεται μια κλήση — η εφαρμογή B (τηλέφωνο) ζητά AUDIOFOCUS_GAIN_TRANSIENT. Το σύστημα στέλνει AUDIOFOCUS_LOSS_TRANSIENT στην εφαρμογή A. Η συσκευή αναπαραγωγής διακόπτεται. Μετά την κλήση, η εφαρμογή B απελευθερώνει την εστίαση, το σύστημα ειδοποιεί την εφαρμογή A μέσω AUDIOFOCUS_GAIN — η συσκευή αναπαραγωγής συνεχίζει. Ολόκληρη η αλυσίδα διαρκεί λιγότερο από 50 ms.
Η σωστή επιλογή durationHint — η βασική απόφαση κατά την υλοποίηση του Audio Focus. Λάθος στην επιλογή τύπου οδηγεί είτε σε επικάλυψη ήχων, είτε σε αδικαιολόγητη διακοπή της συσκευής αναπαραγωγής, είτε σε εκνευρισμό του χρήστη.
| Τύπος αιτήματος | Σενάριο | Αντίδραση κατόχου |
|---|---|---|
| AUDIOFOCUS_GAIN | Εκκίνηση μουσικής, podcast | AUDIOFOCUS_LOSS — η συσκευή αναπαραγωγής πρέπει να σταματήσει |
| AUDIOFOCUS_GAIN_TRANSIENT | Κλήση, φωνητική ειδοποίηση | AUDIOFOCUS_LOSS_TRANSIENT — παύση |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | Οδηγία GPS, σύντομο σήμα | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — σίγαση |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | Φωνητική αναζήτηση, εγγραφή | AUDIOFOCUS_LOSS — πλήρης διακοπή |
Duck — προσωρινή μείωση της έντασης της κύριας συσκευής αναπαραγωγής στο 20–30% κατά τη διάρκεια του δευτερεύοντος ήχου. Το Android παρέχει API για χειροκίνητο duck μέσω AudioManager.adjustSuggestedStreamVolume, αλλά οι περισσότερες συσκευές αναπαραγωγής υλοποιούν τη σίγαση με δικά τους μέσα. Σύμφωνα με το Android Documentation (2026), η επεξεργασία duck δεν πρέπει να διαρκεί περισσότερο από 3 δευτερόλεπτα, μετά την οποία η ένταση αποκαθίσταται.
Για τη σωστή υλοποίηση του Audio Focus πρέπει να εκτελεστούν διαδοχικά τρία βήματα: δημιουργία αιτήματος, αίτηση εστίασης πριν από την αναπαραγωγή και διαχείριση του γεγονότος στο callback. Η χρήση του AudioFocusRequestCompat από το AndroidX media εξασφαλίζει συμβατότητα με όλες τις εκδόσεις Android.
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val focusRequest = AudioFocusRequestCompat.Builder()
.setFocusGain(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setOnAudioFocusChangeListener(focusChangeListener)
.build()
val result = AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
startPlayback()
}
Το αίτημα εστίασης πρέπει να εκτελείται πριν από την έναρξη αναπαραγωγής κάθε φορά που ο χρήστης πατά Play. Εάν το αποτέλεσμα είναι AUDIOFOCUS_REQUEST_GRANTED — ξεκινήστε αναπαραγωγή. Εάν DENIED — εμφανίστε μήνυμα στον χρήστη ή αναβάλετε την αναπαραγωγή μέχρι τη λήψη εστίασης.
private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
restoreVolume()
if (wasPlayingBeforeLoss) resumePlayback()
}
AudioManager.AUDIOFOCUS_LOSS -> {
pausePlayback()
wasPlayingBeforeLoss = false
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
pausePlayback()
wasPlayingBeforeLoss = true
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
duckVolume()
}
}
}
Στο callback είναι σημαντικό να διακρίνετε το AUDIOFOCUS_LOSS από το AUDIOFOCUS_LOSS_TRANSIENT. Στην πρώτη περίπτωση, η συσκευή αναπαραγωγής ΔΕΝ πρέπει να συνεχίσει αυτόματα — ο χρήστης ξεκίνησε ρητά άλλον ήχο. Στη δεύτερη — μπορεί να συνεχίσει αυτόματα κατά τη λήψη AUDIOFOCUS_GAIN. Η σημαία wasPlayingBeforeLoss βοηθά να θυμόμαστε αν πρέπει να αποκατασταθεί η αναπαραγωγή.
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
Η κλήση abandonAudioFocusRequest ενημερώνει το σύστημα ότι η εφαρμογή δεν χρειάζεται πλέον εστίαση. Είναι σημαντικό να καλείται κατά την παύση και τη διακοπή της συσκευής αναπαραγωγής. Εάν η εστίαση δεν απελευθερωθεί, μια άλλη εφαρμογή που ζητά AUDIOFOCUS_GAIN δεν θα λάβει LOSS και οι ήχοι θα επικαλύπτονται.
Η σωστή διαχείριση απώλειας εστίασης — βασική απαίτηση για την επιτυχία στην αξιολόγηση του Google Play. Η λανθασμένη διαχείριση οδηγεί σε αρνητικές κριτικές: οι χρήστες παραπονιούνται ότι η μουσική συνεχίζει να παίζει κατά τη διάρκεια κλήσης ή πάνω από την πλοήγηση.
Κατά τη λήψη AUDIOFOCUS_LOSS, η συσκευή αναπαραγωγής πρέπει να σταματήσει και να μην συνεχίσει μέχρι τη ρητή πίεση του Play. Στο AUDIOFOCUS_LOSS_TRANSIENT (κλήση, ειδοποίηση) η συσκευή αναπαραγωγής διακόπτεται και συνεχίζει αυτόματα όταν αποκατασταθεί η εστίαση. Στο AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK η συσκευή αναπαραγωγής μειώνει προσωρινά την ένταση στο 20–30% κατά τη διάρκεια εξωτερικού ήχου.
Σύμφωνα με το Android Developer Guide (2026), το duck πρέπει να υλοποιείται πολλαπλασιάζοντας το τρέχον επίπεδο έντασης του AudioTrack με συντελεστή 0,2–0,3. Μην χρησιμοποιείτε AudioManager.setStreamVolume — αυτό αλλάζει την ένταση συστήματος και επηρεάζει άλλες εφαρμογές. Το duck εκτελείται μόνο στην πλευρά της δικής σας συσκευής αναπαραγωγής.
Σε εισερχόμενη κλήση, το σύστημα ζητά αυτόματα AUDIOFOCUS_GAIN_TRANSIENT μέσω της εφαρμογής Τηλέφωνο. Η συσκευή αναπαραγωγής λαμβάνει AUDIOFOCUS_LOSS_TRANSIENT και διακόπτεται. Μετά την κλήση ή εάν ο χρήστης απέρριψε την κλήση, η εστίαση επιστρέφει — η συσκευή αναπαραγωγής συνεχίζει αυτόματα, εάν πρόκειται για μουσική συσκευή αναπαραγωγής.
Για εφαρμογές πλοήγησης (Google Maps) χρησιμοποιείται AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK σε φωνητικές οδηγίες. Η συσκευή αναπαραγωγής σιγάζεται για 2–3 δευτερόλεπτα, στη συνέχεια η ένταση αποκαθίσταται. Εάν ο χρήστης ακούει podcast αντί για μουσική, αντί για duck είναι καλύτερο να κάνετε παύση — στα podcast κάθε δευτερόλεπτο μετράει.
Στην πράξη, οι προγραμματιστές αντιμετωπίζουν πολλά τυπικά σενάρια στα οποία το Audio Focus συμπεριφέρεται διαφορετικά. Ας εξετάσουμε τις τυπικές περιπτώσεις και τις σωστές αντιδράσεις σε αυτές.
Είναι σημαντικό να υλοποιήσετε μια σημαία που θυμάται αν η μουσική έπαιζε πριν από την απώλεια εστίασης. Εάν ο χρήστης έκανε ο ίδιος παύση και στη συνέχεια ήρθε μια κλήση — δεν χρειάζεται συνέχιση. Η σημαία μηδενίζεται στη ρητή παύση του χρήστη και ορίζεται κατά την έναρξη αναπαραγωγής.
Σύμφωνα με έρευνα UX της Google (2024), η αυτόματη συνέχιση μετά από κλήση αυξάνει την ικανοποίηση χρήστη κατά 22%. Αλλά εάν η συσκευή αναπαραγωγής συνεχίσει αφού ο χρήστης έχει ήδη ξεκινήσει να βλέπει βίντεο — αυτό προκαλεί εκνευρισμό. Η σημαία wasPlayingBeforeLoss προστατεύει από ψευδείς συνέχισεις.
Συχνές Ερωτήσεις
Ναι, ξεκινώντας από Android 12, το Google Play συνιστά την υλοποίηση του Audio Focus για όλες τις εφαρμογές που αναπαράγουν ήχο. Οι εφαρμογές κατηγορίας Music & Audio υποχρεούνται να το υλοποιήσουν για δημοσίευση. Η αγνόηση μπορεί να οδηγήσει σε απόρριψη της ενημέρωσης.
Ξεκινήστε τη συσκευή αναπαραγωγής, στη συνέχεια ανοίξτε άλλη εφαρμογή με ήχο (π.χ. YouTube Music). Η συσκευή αναπαραγωγής σας πρέπει να διακοπεί. Στη συνέχεια κλείστε το YouTube Music — η συσκευή αναπαραγωγής πρέπει να συνεχίσει αυτόματα. Για δοκιμή duck χρησιμοποιήστε τους Χάρτες Google με φωνητικές οδηγίες.
Το σύστημα ενημερώνει: «Μια άλλη εφαρμογή πρέπει να αναπαράγει έναν σύντομο ήχο — σίγασε τη συσκευή αναπαραγωγής σου». Αυτό είναι βέλτιστο για φωνητικές οδηγίες και σύντομες ειδοποιήσεις. Η ένταση αποκαθίσταται μετά τον εξωτερικό ήχο χωρίς χειροκίνητη παρέμβαση.
Τυπικά ναι — το σύστημα δεν εξαναγκάζει. Αλλά στην πράξη αυτό σημαίνει επικάλυψη ήχων. Ο χρήστης θα ακούσει ταυτόχρονα μουσική και κλήση, οδηγώντας σε αρνητική εμπειρία. Η Google συνιστά πάντα να διαχειρίζεστε το AUDIOFOCUS_LOSS σταματώντας τη συσκευή αναπαραγωγής.
Στο iOS, ανάλογο ρόλο παίζει το Audio Session, το οποίο διαχειρίζεται μέσω AVAudioSession. Οι μηχανισμοί είναι παρόμοιοι: κατηγορίες και επιλογές καθορίζουν τη συμπεριφορά κατά την επικάλυψη ήχων. Ωστόσο, τα API και οι κανόνες διαφέρουν ριζικά — κάθε πλαίσιο υλοποιείται διαφορετικά.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης