У меня есть метод, который пытается создать AudioRecord
. Различные телефоны поддерживают разные частоты дискретизации, конфигурации каналов и аудиоформаты. Таким образом, метод пытается создать AudioRecord
для каждого из них и вернуть первое, что работает.Оператор «return» не работает, даже если нет других ветвей кода.
private AudioRecord getAudioRecord() {
for (int rate: sampleRates) {
for (int audioFormat: audioFormats) {
for (int channelConfig: channelConfigs) {
String description = rate + "Hz, bits: " + audioFormat
+ ", channel: " + channelConfig;
Log.d(TAG, "Trying: " + description);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize == AudioRecord.ERROR
|| bufferSize == AudioRecord.ERROR_BAD_VALUE) {
Log.d(TAG, "Failed: This rate/channel config/format is not supported");
continue;
}
AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_UNINITIALIZED) {
Log.d(TAG, "Failed: Recorder is uninitialized");
continue;
}
Log.d(TAG, "Success: " + description);
return recorder;
}
}
}
Log.e(TAG, "Failed all rates. Does the device have a microphone?");
return null;
}
Проблема return recorder
никогда не бывает!
Вот мой выход LogCat:
На выделенной линии (8000/3/12) нет ошибок, но и не успех.
Если я не использую continue
, как сказано в комментариях ниже, он все равно не возвращается!
private AudioRecord getAudioRecord() {
for (int rate: sampleRates) {
for (int audioFormat: audioFormats) {
for (int channelConfig: channelConfigs) {
String description = rate + "Hz, bits: " + audioFormat
+ ", channel: " + channelConfig;
Log.d(TAG, "Trying (2): " + description);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR && bufferSize != AudioRecord.ERROR_BAD_VALUE) {
AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
Log.d(TAG, "Success: " + description);
return recorder;
} else {
Log.d(TAG, "Failed: Recorder is uninitialized");
}
} else {
Log.d(TAG, "Failed: This rate/channel config/format is not supported");
}
}
}
}
Log.e(TAG, "Failed all rates. Does the device have a microphone?");
return null;
}
Тот же шаблон (попытка записи без последующего успеха или неудачи) также происходит еще 3 раза в журнале. Почти похоже, что блок try/catch ест исключение (или выдает молчащий оператор продолжения). Является ли образец кода, который вы предоставили * точно *, что сгенерировало журнал? –
Это действительно странно. Пробовали ли вы тестировать инверсные условия и вставляете блоки if, и, таким образом, не используете 'continue'? –
Как @SeanReilly упоминает, действительно кажется, что это не код, который генерирует выход журнала. Кажется, что два сообщения 'Trying' в строке кажутся возможными, если в списке кодов отсутствует' break; 'или' continue; '. Вы пробовали очистить и перестроить свое приложение, чтобы убедиться, что занятия актуальны? Вы пытались использовать отладчик и перешли через код? – Gray