私はジンジャーブレッドを使ってNitroHDで開発しています。オーディオを録音したいのですが、MediaRecorder.stop()を呼び出しているときに無限のハングが発生します。
私はそれを正確に行うアプリケーションを持っているので、私の電話は音を録音できることを知っています。
Deitelらの「AndroidforProgrammers」という本を読みました。第16章にVoiceRecorderの例があります。すべて問題ないように見えますが、MediaRecorder.stop()を呼び出すと、アプリが永久にハングします。また、リソースが解放されていないため、解放するには電話を再起動する必要があります。
呼び出しが行われるコードの部分は次のとおりです(Deitel et al。、 "Android for Programmers"、Prentice Hall、2012、chap 16を参照):
// starts/stops a recording
OnCheckedChangeListener recordButtonListener =
new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked)
{
if (isChecked)
{
visualizer.clear(); // clear visualizer for next recording
saveButton.setEnabled(false); // disable saveButton
deleteButton.setEnabled(false); // disable deleteButton
viewSavedRecordingsButton.setEnabled(false); // disable
// create MediaRecorder and configure recording options
if (recorder == null)
recorder = new MediaRecorder(); // create MediaRecorder
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(
MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncodingBitRate(16);
recorder.setAudioSamplingRate(44100);
try
{
// create temporary file to store recording
File tempFile = File.createTempFile(
"VoiceRecorder", ".3gp", getExternalFilesDir(null));
// store File as tag for saveButton and deleteButton
saveButton.setTag(tempFile);
deleteButton.setTag(tempFile);
// set the MediaRecorder's output file
recorder.setOutputFile(tempFile.getAbsolutePath());
recorder.prepare(); // prepare to record
recorder.start(); // start recording
recording = true; // we are currently recording
handler.post(updateVisualizer); // start updating view
} // end try
catch (IllegalStateException e)
{
Log.e(TAG, e.toString());
} // end catch
catch (IOException e)
{
Log.e(TAG, e.toString());
} // end catch
} // end if
else
{
recorder.stop(); // stop recording
recorder.reset(); // reset the MediaRecorder
recording = false; // we are no longer recording
saveButton.setEnabled(true); // enable saveButton
deleteButton.setEnabled(true); // enable deleteButton
recordButton.setEnabled(false); // disable recordButton
} // end else
} // end method onCheckedChanged
}; // end OnCheckedChangedListener
デバッグセッションでは、「else」スコープに入りますが、最初の(stop())行でハングします。
繰り返しますが、別のアプリが正しく動作するため、電話とそのOSが正しいことはわかっています。それで、あなたはこの問題を解決する方法について何か考えがありますか、多分回避策はありますか?
ありがとう!
編集レコーダーがstarted()されると、音の振幅のグラフを表示するために50msごとに実行されるハンドラーがあります。メソッドrecorder.getMaxAmplitude()は常に0を返します。これは、MediaRecorderが正しく初期化されていないことの症状である可能性がありますか?