【问题标题】:java.lang.IllegalStateException at android.media.MediaRecorder.start(Native Method)android.media.MediaRecorder.start 处的 java.lang.IllegalStateException(本机方法)
【发布时间】:2016-06-30 10:27:20
【问题描述】:

我想制作一个录音机应用程序,但是当我单击“开始录音”按钮时它崩溃了。 我在 android.media.MediaRecorder.start(Native Method) 收到一条错误消息,提示 java.lang.IllegalStateException。 我还附上了日志。

package com.example.sahil.chuckit;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import java.io.File;

public class MainActivity extends Activity {

    private static Button submit;
    private static Button submit2;
    private static Button submit3;
    private static Button submit4;
    private MediaPlayer mediaPlayer;
    private MediaRecorder recorder;
    private String output_file;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        output_file = Environment.getExternalStorageState() +    "/audiorecorder.3gpp";
        OnClickButtonListener();OnClickButtonListener1();
        OnClickButtonListener3();OnClickButtonListener4();
     }
     public void OnClickButtonListener(){
        submit =(Button)findViewById(R.id.button);
        submit.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        beginRecording();

                    }
                    }

        );

    }
    public void OnClickButtonListener1(){
        submit2 =(Button)findViewById(R.id.button2);
        submit2.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        stopRecording();
                    }
                }
        );

    }

    public void OnClickButtonListener3(){
        submit3 =(Button)findViewById(R.id.button3);
        submit3.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            playRecording();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
        );

    }
    public void OnClickButtonListener4(){
        submit4 =(Button)findViewById(R.id.button4);
        submit4.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                      stopPlayback();
                    }
                }
        );

    }
    private void ditchMediaRecorder() {
        if (recorder != null)
            recorder.release();
    }
    private void beginRecording() {
        ditchMediaRecorder();
        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.start();
    }
    private void stopRecording() {
        if(recorder!=null)
            recorder.stop();
    }

    private void playRecording() throws Exception {
        ditchMediaPlayer();
        mediaPlayer=new MediaPlayer();
        mediaPlayer.setDataSource(output_file);
        mediaPlayer.prepare();
        mediaPlayer.start();
    }

    private void ditchMediaPlayer() {
        if(mediaPlayer!=null)
        {
            try{
                mediaPlayer.release();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    private void stopPlayback() {
        if (mediaPlayer!=null)
            mediaPlayer.stop();
    }




}

Logcat:

LOG:06-30 05:11:12.603 24621-24621/com.example.sahil.chuckit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sahil.chuckit, PID: 24621 java.lang.IllegalStateException
    at android.media.MediaRecorder.start(Native Method)
    at com.example.sahil.chuckit.MainActivity.beginRecording(MainActivity.java:111)
    at com.example.sahil.chuckit.MainActivity.access$000(MainActivity.java:22)
    at com.example.sahil.chuckit.MainActivity$1.onClick(MainActivity.java:46)
    at android.view.View.performClick(View.java:5198)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-30 05:11:14.891 24621-24621/com.example.sahil.chuckit I/Process: Sending signal. PID: 24621 SIG: 9

【问题讨论】:

  • if(recorder!=null){ recorder.stop(); recoder.release(); recorder = null;} 因为如果我们在重新启动时不释放记录器,我们会得到 android.media.MediaRecorder.start(Native Method) ;)

标签: android android-studio voice-recording


【解决方案1】:

您忘记在beginRecording 函数中的recordeer.start() 函数之前调用recorder.prepare()

Prepare 函数会处理很多事情,例如将模拟数据转换为数字音频以进行压缩以及文件的存储位置等

【讨论】:

  • 是的,但是在添加准备之后,我得到了这个指向我的 recorder.start(); 的语句函数 java.lang.RuntimeException:启动失败。在 android.media.MediaRecorder.start(本机方法)
  • 您是否在清单中添加了所需的权限,例如录制音频和外部存储,如果是,那么您可以参考此链接以获取适当的示例 (stackoverflow.com/questions/11005859/…)
【解决方案2】:
`if (audioRecorder != null) {
            try {
                audioRecorder.stop();
                audioRecorder.reset();
                audioRecorder.release();
                audioRecorder = null;
                
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }`

因为我们没有发布记录器,只是停止记录器 在重新启动时,我们得到 android.media.MediaRecorder.start(Native Method) 花了1个小时弄清楚

快乐编码

【讨论】:

    【解决方案3】:

    您必须考虑到,MediaRecorderMediaPlayer 具有它们的状态机,它要求您按特定顺序执行某些操作。

    在这里您尝试在没有准备MediaRecorder 的情况下开始录制。打电话

    recorder.prepare();
    

    之前:

    recorder.start();
    

    【讨论】:

    • 你说得对,但在添加准备语句后,我收到此错误消息 java.lang.RuntimeException: start failed。在android.media.MediaRecorder.start(Native Method),这是我的recorder.start();功能
    【解决方案4】:

    在 setOutFormat() 之后、prepare() 之前调用它。


    这正是我编写此方法名称时我的 android studio 文档对话框所说的内容。 关键是你应该在prepare()之前调用这个方法。
    这是一个例子:

    private void startRecording() {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MediaMaster/Dub/");
        Log.i(TAG, "startRecording: creating output file " + outputFolder.mkdirs());
        File output = new File(outputFolder.getAbsolutePath()+"out" + new Date().getTime() + ".3gpp");
        mediaRecorder.setOutputFile(output.getAbsolutePath());
        mediaRecorder.setMaxDuration(3000);
        try {
            mediaRecorder.prepare();
        } catch (IOException e) {
            Log.e(TAG, "startRecording: ", e);
        }
        mediaRecorder.start();
    }
    


    【讨论】:

      【解决方案5】:

      原因:android.media.MediaRecorder.native_start(Native Method) 处的 java.lang.IllegalStateException

      我遇到了有关媒体记录器的问题。它录制得很完美,但是我尝试再次录制屏幕然后我收到此错误并且媒体记录器崩溃了。在尝试了很多事情和战术之后,我尝试了这个 mediarecorder.release(); 使用这种方法,每次我停止录制时,媒体录制器都会被释放,让我能够再次录制。

      【讨论】:

        猜你喜欢
        • 2016-11-23
        • 2014-09-06
        • 2023-03-11
        • 2013-10-21
        • 2021-01-22
        • 1970-01-01
        • 2011-06-04
        • 2018-12-29
        相关资源
        最近更新 更多