【问题标题】:Why do I get IllegalStateException on stopping recording audio?为什么停止录制音频时会出现 IllegalStateException?
【发布时间】: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


【解决方案1】:

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

MediaRecorder.java

  /**
     * Stops recording. Call this after start(). Once recording is stopped,
     * you will have to configure it again as if it has just been constructed.
     * Note that a RuntimeException is intentionally thrown to the
     * application, if no valid audio/video data has been received when stop()
     * is called. This happens if stop() is called immediately after
     * start(). The failure lets the application take action accordingly to
     * clean up the output file (delete the output file, for instance), since
     * the output file is not properly constructed when this happens.
     *
     * @throws IllegalStateException if it is called before start()
     */
    public native void stop() throws IllegalStateException;

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

【讨论】:

  • 但是 OP 的代码中包含了对 start() 方法的调用,那么这个答案如何帮助解决问题呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多