2012-02-05 8 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は起こりません!ノー成功も強調表示された行(3分の8000/12)に

Logcat output

エラーがない、しかし:

は、ここに私のlogcat出力です。

私が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のように、実際にはログ出力を生成するコードではないようです。 2行目の 'Trying'メッセージは、あなたのコードリストにない' break; 'や' continue; 'が存在しない限り可能です。クラスを最新の状態に保つためにアプリケーションのクリーニングと再構築を試みましたか?あなたはデバッガを使用してコードを実行しようとしましたか? – Gray

答えて

0

try/catchブロックであなたの関数をラップし、あなたはおそらく何かが例外がスローされる原因になっていることがわかります。あなたのaudiorecordのは決して初期化されていないので、return文には問題はありません

+1

例外がスローされた場合、それは捕捉されるまでコールスタックまで上がります。繰り返しはすぐに終了します。 –

1

が、あなたは、単に(ほとんどの例では、そこに、それをチェックしていないにもかかわらず、彼らはおそらく必要があります)簡単な正気として

それに到達することはありませんあなたがかもしれチェックマニフェストファイルをverify you have the proper permissionsにチェックして、マイクへのアクセスが存在する場合と存在しない場合があるハードウェア機能であることを前提に、オーディオを最初に録音します。

関連する問題