Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我在停止录制音频时遇到非法状态异常?_Android_Audio_Illegalstateexception_Android Audiorecord - Fatal编程技术网

Android 为什么我在停止录制音频时遇到非法状态异常?

Android 为什么我在停止录制音频时遇到非法状态异常?,android,audio,illegalstateexception,android-audiorecord,Android,Audio,Illegalstateexception,Android Audiorecord,我想用麦克风录制音频并保存音频文件。开始录制工作正常,但当我尝试停止录制时,仿真器会给出一个强制关闭错误。堆栈跟踪: 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 andr

我想用麦克风录制音频并保存音频文件。开始录制工作正常,但当我尝试停止录制时,仿真器会给出一个强制关闭错误。堆栈跟踪:

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();
    }
}   
如何开始录制:

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" />


所以,开始录音工作正常,但停止录音不行。有人知道代码出了什么问题吗?

您的录音机显然没有处于录制状态。你应该确定它是否成功启动。因为在start()之前调用stop()时会发生IllegalStateException。并在stop()块中添加RuntimeException(如果抛出),然后删除输出文件

如果需要连续启动和停止应用程序,我还建议在应用程序关闭之前不要释放recorder对象。根据以下流程,创建recorder onCreate()/onResume()并释放onPause/onDestroy()


请不要重复问题中的标记。我已经把它编辑掉了。您能为您的代码添加更多的上下文吗,例如,您如何/在哪里声明
记录器
?(例如,如果它是
BroadcastReceiver
的非静态成员,您可能会遇到此类问题)。您是否完成了中的步骤3、4、5、6?我用如何开始录制的代码编辑了我的问题。我不仅仅指如何启动录制器,还指如何以及在何处声明录制器。这些变量和方法是什么类型的对象的一部分?但是OP的代码包括对
start()
方法的调用,那么这个答案如何帮助解决这个问题呢?