【发布时间】:2012-12-24 00:23:44
【问题描述】:
我想用麦克风录制音频并保存音频文件。开始录制工作正常,但是当我尝试停止录制时,模拟器会出现强制关闭错误。堆栈跟踪:
01-09 18:16:59.075: E/AndroidRuntime(831): FATAL EXCEPTION: main
01-09 18:16:59.075: E/AndroidRuntime(831): java.lang.IllegalStateException
01-09 18:16:59.075: E/AndroidRuntime(831): at android.media.MediaRecorder.stop(Native Method)
01-09 18:16:59.075: E/AndroidRuntime(831): at com.example.voice.recorder.MainActivity.StopRecording(MainActivity.java:45)
01-09 18:16:59.075: E/AndroidRuntime(831): at com.example.voice.recorder.MainActivity$1.onClick(MainActivity.java:76)
01-09 18:16:59.075: E/AndroidRuntime(831): at android.view.View.performClick(View.java:3511)
01-09 18:16:59.075: E/AndroidRuntime(831): at android.view.View$PerformClick.run(View.java:14105)
01-09 18:16:59.075: E/AndroidRuntime(831): at android.os.Handler.handleCallback(Handler.java:605)
01-09 18:16:59.075: E/AndroidRuntime(831): at android.os.Handler.dispatchMessage(Handler.java:92)
01-09 18:16:59.075: E/AndroidRuntime(831): at android.os.Looper.loop(Looper.java:137)
01-09 18:16:59.075: E/AndroidRuntime(831): at android.app.ActivityThread.main(ActivityThread.java:4424)
01-09 18:16:59.075: E/AndroidRuntime(831): at java.lang.reflect.Method.invokeNative(Native Method)
01-09 18:16:59.075: E/AndroidRuntime(831): at java.lang.reflect.Method.invoke(Method.java:511)
01-09 18:16:59.075: E/AndroidRuntime(831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-09 18:16:59.075: E/AndroidRuntime(831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-09 18:16:59.075: E/AndroidRuntime(831): at dalvik.system.NativeStart.main(Native Method)
它在 MediaRecorder.stop() 上给出错误; 这就是我尝试停止录制的方式:
public void StopRecording() throws IOException{
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
}
我如何开始录制:
public class MainActivity extends Activity {
MediaRecorder recorder;
public void StartRecording(){
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/sample.3gp");
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
以及我如何调用该方法:
if (!tv.getText().equals("Recording...")){
tv.setText("Recording...");
tv.setTextColor(Color.RED);
record.setImageResource(R.drawable.microphone_icon_pressed);
StartRecording();
}else{
tv.setText("Click the button to start recording");
record.setImageResource(R.drawable.microphone_icon);
tv.setTextColor(Color.BLACK);
try {
StopRecording();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我的清单中有这 2 个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
所以开始录制工作正常,但停止录制却不行。有人知道代码有什么问题吗?
【问题讨论】:
-
请不要重复问题中的标签。我已经编辑了。
-
您能否为您的代码添加更多上下文,例如你如何/在哪里声明
recorder? (例如,如果它是BroadcastReceiver的非静态成员,您可能会遇到这类问题)。 -
您是否完成了audio capture guide的步骤3、4、5、6?
-
我用如何开始录制的代码编辑了我的问题
-
我的意思不仅是您如何启动记录器,还包括您声明它的方式和位置。这些变量和方法属于什么类型的对象?
标签: android audio illegalstateexception android-audiorecord