我的MediaRecorder出现了奇怪的问题。它记录语音,制作带录音的文件。但是当我想使用stop()方法停止录制时,它会抛出IllegalStateException。通常我使用了setMaxDuration()方法,所以通常我使用OnInfoListener进行结束录制并且它正常工作。但我还想在ImageView的OnTouchListener中停止MediaRecorder。我的代码在这里:
private static String OUTPUT_FILE;
private void prepareRecording() throws Exception {
OUTPUT_FILE = "/sdcard/temp.3gpp";
File outFile = new File(OUTPUT_FILE);
if (outFile.exists())
outFile.delete();
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(OUTPUT_FILE);
recorder.setMaxDuration(10000);
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
}
private void startRecording() {
ImageView image = (ImageView) this.findViewById(R.id.image);
image.post(new Runnable() {
@Override
public void run() {
try {
prepareRecording();
} catch (Exception e) {
e.printStackTrace();
}
image.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (recorder != null)
recorder.stop();
return true;
}
});
recorder.setOnInfoListener(new OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
if (recorder != null && what == 800){
recorder.stop();
}
}
});
}});
}
当我触摸ImageView时,我在代码为recorder.stop()的行上有FATAL EXCEPTION java.lang.IllegalStateException。我测试了我的代码,我意识到MediaRecorder似乎没有启动。因此我在recorder.stop()中有IllegalStateException。但是当录音停止时,我可以在我的SD卡录音文件上找到。我的代码怎么了?
我还将AnimationDrawable连接到我的图像。它运作正常。
答案 0 :(得分:1)
我已经解决了我的问题。有必要在onTouch方法中启动新线程以避免eceptions。
image.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Thread thread = new Thread(){
public void run(){
if (recorder != null)
recorder.stop();
}
};
thread.start();
return false;
}
});