Microphone Permission είναι μια άδεια συστήματος που απαιτείται από την εφαρμογή για την πρόσβαση στο μικρόφωνο της συσκευής. Χρειάζεται για την εγγραφή ήχου, τα φωνητικά μηνύματα, τις βιντεοκλήσεις και την αναγνώριση ομιλίας. Σύμφωνα με τα Apple Developer Documentation, 2024, όλες οι εφαρμογές που χρησιμοποιούν λήψη ήχου υποχρεούνται να ζητούν τη ρητή συγκατάθεση του χρήστη μέσω συστημικού διαλόγου.
Τα κύρια σημεία
Το Microphone Permission είναι ένας μηχανισμός προστασίας της ιδιωτικότητας που αποτρέπει τη μη εξουσιοδοτημένη καταγραφή ήχου από το μικρόφωνο της συσκευής. Οι φορητές πλατφόρμες κατατάσσουν το μικρόφωνο στους πιο ευαίσθητους πόρους, καθώς η εγγραφή ήχου μπορεί να συλλάβει προσωπικές συνομιλίες, το περιβάλλον και εμπιστευτικές πληροφορίες.
Το Android ταξινομεί το RECORD_AUDIO ως επικίνδυνη άδεια, ενώ το iOS απαιτεί την υποχρεωτική προσθήκη του κλειδιού NSMicrophoneUsageDescription στο Info.plist. Και στις δύο πλατφόρμες το αίτημα εκτελείται κατά τον χρόνο εκτέλεσης και ο χρήστης μπορεί να ανακαλέσει την άδεια ανά πάσα στιγμή μέσω των ρυθμίσεων συστήματος. Η συστημική ένδειξη εγγραφής (πορτοκαλί κουκκίδα στο iOS, πράσινη ένδειξη στο Android 12+) ενημερώνει τον χρήστη ότι η εφαρμογή χρησιμοποιεί το μικρόφωνο εκείνη τη στιγμή.
Σύμφωνα με έρευνα του Pew Research Center (2024), το 54% των χρηστών φορητών συσκευών έχει αρνηθεί τουλάχιστον μία φορά στην εφαρμογή την πρόσβαση στο μικρόφωνο. Ο κύριος λόγος είναι η έλλειψη κατανόησης γιατί η εφαρμογή χρειάζεται την εγγραφή ήχου. Ως εκ τούτου, ο προγραμματιστής πρέπει να εξηγεί με μέγιστη διαφάνεια τον σκοπό χρήσης του μικροφώνου.
Η άδεια μικροφώνου στο Android ζητείται μέσω της δήλωσης RECORD_AUDIO στο manifest και αιτήματος κατά τον χρόνο εκτέλεσης στον κώδικα της εφαρμογής. Ξεκινώντας από το Android 10, η πρόσβαση στο μικρόφωνο ρυθμίζεται επιπλέον από περιορισμούς για εφαρμογές παρασκηνίου.
Το πρώτο βήμα είναι να δηλώσετε την άδεια RECORD_AUDIO στο αρχείο manifest. Χωρίς αυτή τη δήλωση, το αίτημα κατά τον χρόνο εκτέλεσης δεν θα έχει αποτέλεσμα και η εφαρμογή δεν θα μπορεί να αποκτήσει πρόσβαση στο μικρόφωνο.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
Το CAPTURE_AUDIO_OUTPUT είναι μια συστημική άδεια που δεν είναι διαθέσιμη σε εφαρμογές τρίτων. Χρησιμοποιείται μόνο από εφαρμογές συστήματος για τη λήψη της εξόδου ήχου. Για τις συνηθισμένες εφαρμογές αρκεί το RECORD_AUDIO για την εγγραφή από το μικρόφωνο.
Μετά τη δήλωση στο manifest πρέπει να εκτελεστεί το αίτημα κατά τον χρόνο εκτέλεσης. Ας δούμε ένα παράδειγμα με χρήση του AudioRecord για την εγγραφή ήχου από το μικρόφωνο.
private val recordAudioPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
startRecording()
} else {
showMicrophoneExplanation()
}
}
fun startRecording() {
val sampleRate = 44100
val bufferSize = AudioRecord.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT)
val recorder = AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize)
recorder.startRecording()
// Εγγραφή δεδομένων ήχου στο buffer
}
Είναι σημαντικό να διαχειρίζεστε σωστά τον κύκλο ζωής της εγγραφής ήχου. Όταν η εφαρμογή μεταβαίνει σε λειτουργία παρασκηνίου σε Android 9 και νεότερο, η εγγραφή από το μικρόφωνο μπορεί να ανασταλεί από το σύστημα. Ξεκινώντας από το Android 10, η πρόσβαση στο μικρόφωνο στο παρασκήνιο περιορίζεται περαιτέρω: η εφαρμογή στο παρασκήνιο δεν μπορεί να ξεκινήσει εγγραφή, ενώ η ενεργή εγγραφή διακόπτεται. Για την εγγραφή στο παρασκήνιο απαιτείται MediaProjection ή Service με ειδοποίηση.
Η άδεια μικροφώνου στο iOS ρυθμίζεται μέσω του κλειδιού NSMicrophoneUsageDescription στο Info.plist και της κλήσης της μεθόδου AVAudioSession.requestRecordPermission. Η Apple απαιτεί την υποχρεωτική αναφορά του λόγου χρήσης του μικροφώνου στον διάλογο αιτήματος.
Το κλειδί NSMicrophoneUsageDescription είναι υποχρεωτικό για κάθε εφαρμογή που ζητά πρόσβαση στο μικρόφωνο. Χωρίς αυτό, η εφαρμογή θα τερματιστεί απρόσμενα κατά την προσπάθεια εγγραφής ήχου.
<key>NSMicrophoneUsageDescription</key>
<string>Η εφαρμογή χρειάζεται πρόσβαση στο μικρόφωνο για την εγγραφή φωνητικών σημειώσεων και την αποστολή ηχητικών μηνυμάτων.</string>
Το αίτημα πρόσβασης στο μικρόφωνο στο iOS εκτελείται μέσω του AVAudioSession. Αφού ληφθεί η απάντηση, η εφαρμογή διαμορφώνει την ακουστική συνεδρία και ξεκινά την εγγραφή.
import AVFAudio
func requestMicrophoneAccess() {
AVAudioSession.sharedInstance().requestRecordPermission { granted in
DispatchQueue.main.async {
if granted {
self.configureAudioSession()
self.startAudioRecording()
} else {
self.redirectToSettings()
}
}
}
}
private func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playAndRecord, mode: .default)
try session.setActive(true)
} catch {
print("Audio session error: \(error)")
}
}
Σε iOS 14 και νεότερο, η εφαρμογή που χρησιμοποιεί το μικρόφωνο εμφανίζει πορτοκαλί ένδειξη στη γραμμή κατάστασης. Ο χρήστης βλέπει ποια εφαρμογή καταγράφει ήχο εκείνη τη στιγμή. Εάν η εφαρμογή χρησιμοποιεί το μικρόφωνο στο παρασκήνιο χωρίς σοβαρό λόγο, η Apple μπορεί να απορρίψει την ενημέρωση. Το AVAudioSession επιτρέπει τη διαμόρφωση της κατηγορίας και της λειτουργίας της ακουστικής συνεδρίας, καθορίζοντας τη συμπεριφορά της εφαρμογής κατά τη μετάβαση σε λειτουργία παρασκηνίου.
Τα σενάρια χρήσης του μικροφώνου σε φορητές εφαρμογές είναι ποικίλα: από την απλή εγγραφή φωνής έως την πολύπλοκη επεξεργασία της ροής ήχου σε πραγματικό χρόνο.
Οι εφαρμογές ανταλλαγής μηνυμάτων και σημειώσεων χρησιμοποιούν το μικρόφωνο για την εγγραφή φωνητικών μηνυμάτων. Σε αυτή την περίπτωση, το Microphone Permission ζητείται όταν πατηθεί το κουμπί εγγραφής. Μετά την ολοκλήρωση της εγγραφής είναι σημαντικό να σταματήσετε την ακουστική συνεδρία ώστε άλλες εφαρμογές να μπορούν να χρησιμοποιήσουν το μικρόφωνο. Το AVAudioSession στο iOS και το AudioManager στο Android διαχειρίζονται την εστίαση ήχου.
Οι εφαρμογές με φωνητική είσοδο (αναζήτηση, υπαγόρευση, φωνητικοί βοηθοί) χρησιμοποιούν το μικρόφωνο σε συνδυασμό με API αναγνώρισης ομιλίας. Στο Android πρόκειται για το SpeechRecognizer από το android.speech, στο iOS για το SFSpeechRecognizer από το πλαίσιο Speech. Για την αναγνώριση ομιλίας μπορεί να χρειαστεί πρόσθετη άδεια πρόσβασης στις υπηρεσίες αναγνώρισης (SPEECH στο Android, SFSpeechRecognizer.requestAuthorization στο iOS).
Οι εφαρμογές βιντεοκλήσεων (WebRTC, Zoom, Telegram) ζητούν το Microphone Permission ταυτόχρονα με το Camera Permission. Σε αυτό το πλαίσιο είναι σημαντικό να ζητούνται και οι δύο άδειες διαδοχικά και όχι ταυτόχρονα, ώστε ο χρήστης να μην κατακλύζεται από διαλόγους. Το WebRTC χρησιμοποιεί το getUserMedia για τη λήψη ήχου και βίντεο, αλλά στις φορητές πλατφόρμες απαιτούνται προηγουμένως συστημικές άδειες.
Για ποιοτική εγγραφή απαιτείται σωστή διαμόρφωση των παραμέτρων της ακουστικής συνεδρίας. Στο iOS η κατηγορία .playAndRecord επιτρέπει την ταυτόχρονη αναπαραγωγή και εγγραφή ήχου. Στο Android η επιλογή AudioSource.MIC εξασφαλίζει τη λήψη από το κύριο μικρόφωνο, ενώ το AudioSource.VOICE_COMMUNICATION βελτιστοποιεί την εγγραφή για φωνητική επικοινωνία. Επιπλέον, μπορείτε να ρυθμίσετε τη συχνότητα δειγματοληψίας 44100 Hz και τη μορφή PCM 16 bit για να επιτύχετε τυπική ποιότητα CD.
Κατά την εγγραφή ήχου μπορεί να προκύψουν συστημικές διακοπές: εισερχόμενη κλήση, ενεργοποίηση ξυπνητηριού, ειδοποίηση από άλλη εφαρμογή. Στο iOS το AVAudioSessionDelegate διαχειρίζεται τα beginInterruption και endInterruption. Στο Android το AudioManager.OnAudioFocusChangeListener ενημερώνει την εφαρμογή για την απώλεια ή την επιστροφή της εστίασης ήχου. Η σωστή διαχείριση των διακοπών επιτρέπει τη διατήρηση της εγγραφής σε απροσδόκητα συμβάντα και αποτρέπει την απώλεια δεδομένων. Συνιστάται να διακόπτεται η εγγραφή κατά την απώλεια της εστίασης και να συνεχίζεται μετά την επιστροφή της, με ενημέρωση του χρήστη.
Η βελτιστοποίηση της λήψης ήχου περιλαμβάνει τη ρύθμιση της συχνότητας δειγματοληψίας, του μεγέθους buffer και της μορφής κωδικοποίησης. Για τα φωνητικά μηνύματα αρκεί συχνότητα 44100 Hz και μονοφωνικό κανάλι. Για την αναγνώριση ομιλίας μπορεί να χρειαστεί συχνότητα 16000 Hz.
Στο iOS χρησιμοποιήστε το AVAudioSession.setPreferredIOBufferDuration για τη ρύθμιση της καθυστέρησης εγγραφής. Το μικρότερο buffer μειώνει την καθυστέρηση, αλλά αυξάνει το φορτίο στον επεξεργαστή. Στο Android το AudioRecord.getMinBufferSize επιστρέφει το ελάχιστο μέγεθος buffer για τις δεδομένες παραμέτρους. Συνιστάται η χρήση buffer τουλάχιστον ίσου με αυτό το ελάχιστο για την αποφυγή απώλειας δεδομένων κατά την εγγραφή σε συνθήκες υψηλού φορτίου συστήματος.
Οι βέλτιστες πρακτικές εργασίας με το Microphone Permission στοχεύουν στην ενίσχυση της εμπιστοσύνης του χρήστη και στη συμμόρφωση με τις απαιτήσεις των πλατφορμών.
Πριν από το αίτημα Microphone Permission εμφανίστε μια οθόνη στην οποία εξηγείτε γιατί η εφαρμογή χρειάζεται το μικρόφωνο και πώς θα χρησιμοποιηθεί η εγγραφή. Αναφέρετε αν ο ήχος μεταδίδεται στον διακομιστή ή επεξεργάζεται τοπικά. Οι χρήστες συναινούν πολύ πιο συχνά στην πρόσβαση όταν κατανοούν ότι η εγγραφή δεν φεύγει από τη συσκευή. Η τοπική επεξεργασία (on-device ASR) αποτελεί ισχυρό επιχείρημα για την εμπιστοσύνη.
Εάν η εφαρμογή δεν απαιτεί εγγραφή ήχου στο παρασκήνιο, σταματήστε οπωσδήποτε το μικρόφωνο κατά τη μετάβαση σε λειτουργία παρασκηνίου. Αυτό όχι μόνο εξοικονομεί μπαταρία, αλλά αποτρέπει και την αρνητική αντίδραση του χρήστη που βλέπει την ένδειξη εγγραφής. Στο iOS χρησιμοποιήστε τις μεθόδους του UIApplicationDelegate, όπως την applicationDidEnterBackground, για την αναστολή της εγγραφής. Στο Android διαχειριστείτε τα onPause και onStop στο Activity ή στο Service.
Εμφανίστε τη δική σας ένδειξη εγγραφής (κινούμενο εικονίδιο μικροφώνου ή κύμα) κατά τη λήψη ήχου. Αυτό ενημερώνει τον χρήστη ότι το μικρόφωνο είναι ενεργό και μειώνει τον κίνδυνο αρνητικής αντίδρασης. Η Apple και η Google συνιστούν να αντιγράφεται η συστημική ένδειξη με δικό σας στοιχείο UI για μέγιστη διαφάνεια.
Συχνές ερωτήσεις
Όχι, η άδεια μικροφώνου απαιτείται μόνο για τη λήψη ήχου από το μικρόφωνο. Η αναπαραγωγή ήχου μέσω ηχείου ή ακουστικών δεν απαιτεί Microphone Permission. Για την αναπαραγωγή αρκεί η διαμόρφωση της ακουστικής συνεδρίας στο iOS ή του AudioTrack στο Android.
Χρησιμοποιήστε το ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO). Η μέθοδος επιστρέφει PackageManager.PERMISSION_GRANTED ή PERMISSION_DENIED. Επιπλέον, ελέγξτε αν το μικρόφωνο είναι διαθέσιμο στη συσκευή μέσω του PackageManager.hasSystemFeature.
Προσφέρετε ένα εναλλακτικό σενάριο: κειμενική είσοδο αντί για φωνητική, αποστολή μηνύματος χωρίς ήχο, προβολή βίντεο χωρίς ήχο. Εάν η λειτουργία φωνητικής εισόδου είναι κρίσιμη, εμφανίστε μια οθόνη με οδηγίες για την ενεργοποίηση της άδειας στις ρυθμίσεις συστήματος και ένα κουμπί μετάβασης.
Ξεκινώντας από το Android 12, η εφαρμογή στο παρασκήνιο δεν μπορεί να αποκτήσει πρόσβαση στο μικρόφωνο. Η ενεργή εγγραφή διακόπτεται κατά τη μετάβαση σε λειτουργία παρασκηνίου. Επιπλέον, εμφανίστηκε η ένδειξη Privacy Chip — ένα πράσινο εικονίδιο στη γραμμή κατάστασης που δείχνει ότι η εφαρμογή χρησιμοποιεί το μικρόφωνο.
Οι πιο συχνές αιτίες: απουσία του κλειδιού NSMicrophoneUsageDescription, ασαφής περιγραφή του λόγου ("για βελτίωση της υπηρεσίας" αντί για "για εγγραφή φωνητικών μηνυμάτων"), αίτημα άδειας χωρίς σαφή ενέργεια του χρήστη ή χρήση του μικροφώνου στο παρασκήνιο χωρίς αιτιολογημένη λειτουργικότητα.
Συμπεράσματα
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης