Как реализована запись голоса пользователя
Что проверяют
Знаете ли вы разницу между двумя API записи и ограничения платформы вокруг микрофона: разрешения, фон, хранение файлов. Следом обычно спрашивают, как вести запись дольше, чем открыт экран, и как не потерять её при сворачивании приложения.
Как отвечать
Сначала выбор инструмента:
MediaRecorder: пишет сразу сжатый файл. Для голоса обычноOutputFormat.MPEG_4сAudioEncoder.AACили, начиная с Android 10,OutputFormat.OGGсAudioEncoder.OPUS. С Android 12 создаётся через конструктор сContext;AudioRecord: отдаёт сырой PCM. Нужен, когда звук обрабатывается на лету: распознавание речи, визуализация громкости, свой кодек. Буфер читают в цикле на отдельном потоке или в корутине наDispatchers.IO, пока запись не остановлена.
Дальше обвязка:
- разрешение:
RECORD_AUDIOотносится к опасным, его запрашивают в рантайме черезActivityResultContracts.RequestPermissionи обрабатывают отказ; - фон: с Android 9 приложение в фоне получает от микрофона тишину. Долгая запись идёт в foreground service с
foregroundServiceType="microphone", а с Android 14 ещё и с разрешениемFOREGROUND_SERVICE_MICROPHONE; - хранение: пишите в
filesDirилиcacheDir, разрешение на хранилище для этого не нужно; - параметры: 44100 Гц единственная частота, которую документация гарантирует на всех устройствах, для распознавания речи часто берут 16 кГц моно. Источник
AudioSource.VOICE_RECOGNITIONотключает часть обработки сигнала,NoiseSuppressorеё добавляет; - ресурсы:
stop()иrelease()вfinallyили по жизненному циклу, иначе микрофон останется занят для других приложений.
С Android 12 пользователь может выключить микрофон системным переключателем, и приложение должно это пережить.
Где спотыкаются
Читают из AudioRecord один буфер и считают, что записали голос. Это несколько десятков миллисекунд, нужен цикл до остановки.
Сохраняют сырой PCM с расширением .wav. У PCM нет заголовка, плеер его не откроет, пока вы не допишете WAV-заголовок.
Запускают запись из Activity и теряют её при сворачивании, потому что не знают про ограничение фона и тип сервиса microphone.