2012-02-05 2 views
5

У меня есть метод, который пытается создать 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:

Logcat output

На выделенной линии (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; 
} 
+1

Тот же шаблон (попытка записи без последующего успеха или неудачи) также происходит еще 3 раза в журнале. Почти похоже, что блок try/catch ест исключение (или выдает молчащий оператор продолжения). Является ли образец кода, который вы предоставили * точно *, что сгенерировало журнал? –

+0

Это действительно странно. Пробовали ли вы тестировать инверсные условия и вставляете блоки if, и, таким образом, не используете 'continue'? –

+0

Как @SeanReilly упоминает, действительно кажется, что это не код, который генерирует выход журнала. Кажется, что два сообщения 'Trying' в строке кажутся возможными, если в списке кодов отсутствует' break; 'или' continue; '. Вы пробовали очистить и перестроить свое приложение, чтобы убедиться, что занятия актуальны? Вы пытались использовать отладчик и перешли через код? – Gray

ответ

0

Оберните функцию в блоке try/catch и вы, вероятно, обнаружите, что что-то вызывает исключение быть выброшен.

+1

Если было выбрано исключение, оно доходило бы до стека вызовов до момента его обнаружения. Итерация остановится немедленно. –

1

Там нет никаких проблем с обратным утверждением, вы просто никогда не достигают его, потому что ваш AudioRecord никогда не инициализирует (Большинство примеров там не проверить это, несмотря на то, что они, вероятно, должны)

В краткой проверке разумности вы можете хотите проверить свой файл манифеста на verify you have the proper permissions для записи звука в первую очередь, учитывая, что доступ к микрофону - это аппаратная функция, которая может/не существовать.