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).