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