AudioRecord: start() status -38
У меня есть следующая проблема:
Я использую SpeechRecognizer для определения нескольких слов.
Я использую
public void onResults
чтобы уничтожить SpeechRecognizer.
Сразу после разрушения я инициализирую AudioRecord и начинаю запись с микрофона.
Это приводит к следующей ошибке в моем logcat:
12-09 00:44:01.976: E/AudioRecord(21185): start() status -38
Никакое исключение не выбрасывается в моем коде. AudioRecord просто не запускается должным образом.
Я предполагаю, что SpeechRecognizer не выпускает микрофон достаточно быстро,
потому что, если я добавлю Thread.sleep(200) перед инициализацией AudioRecord, я
не испытывайте эту проблему.
Это решение очень плохо по понятным причинам. Таким образом, у меня есть следующий вопрос:
Как проверить правильность инициализации AudioRecord? (Я не получаю исключения в своем коде.)
_audioRecord.getState() == AudioRecord.STATE_UNINITIALIZED
также является ложным.
Или как я могу проверить, правильно ли SpeechRecognizer выпустил микрофон?
Спасибо большое!
Ответы
Ответ 1
Вам нужно убедиться, что вы выбрали audioRecord.stop();
и audioRecord.release();
в своих onPause()
или подобных методах. Если вы этого не сделаете, при следующем запуске приложения вы не получите доступ к устройству, и вы получите start() status -38
Ответ 2
У меня была аналогичная проблема с этим статусом ошибки startD (AudioRecord) -38
что я в конце концов сделал, это цикл над возможными конфигурациями звукозаписывающего устройства, как сказал ответчик в этом вопросе
Объект AudioRecord не инициализируется
Мне нравится этот метод, так как не имеет значения, какое устройство вы запускаете на нем, в конечном итоге найдет конфигурацию, которая ему нравится.
Ответ 3
Я проверил состояние записи, используя audioRecord.getRecordingState()
, как прокомментировал Майкл.
Обычно после audioRecord.startRecording();
recordingState становится RECORDSTATE_RECORDING.
Если состояние не RECORDSTATE_RECORDING, я закрою приложение.
audioRecord.startRecording();
int recordingState = audioRecord.getRecordingState();
Log.i(VoiceRecorder.class.getSimpleName(), "RecordingState() after startRecording() = " + String.valueOf(recordingState));
if (recordingState != AudioRecord.RECORDSTATE_RECORDING) {
Log.i(VoiceRecorder.class.getSimpleName(), "AudioRecord error has occured. Reopen app.");
System.exit(0);
}
Ответ 4
У меня было другое приложение, которое, вероятно, работало в фоновом режиме и не выпустило записывающее устройство. Вы также должны убедиться, что все другие приложения закрыты (используя переключатель между приложениями> CLEAR ALL).