Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.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
Java Android MediaRecorder不工作,在stop()方法上崩溃_Java_Android_Illegalstateexception_Mediarecorder_Android Mediarecorder - Fatal编程技术网

Java Android MediaRecorder不工作,在stop()方法上崩溃

Java Android MediaRecorder不工作,在stop()方法上崩溃,java,android,illegalstateexception,mediarecorder,android-mediarecorder,Java,Android,Illegalstateexception,Mediarecorder,Android Mediarecorder,我正在学习android开发,我正在使用MediaRecorder类录制音频。logcat说应用程序在stop()方法中崩溃,并抛出IllegalStateException。我不明白它为什么会崩溃,我在启动之前调用了stop方法 public class MainActivity extends AppCompatActivity { private MediaRecorder grabacion; private String archivoSalida = null; private B

我正在学习android开发,我正在使用MediaRecorder类录制音频。logcat说应用程序在stop()方法中崩溃,并抛出IllegalStateException。我不明白它为什么会崩溃,我在启动之前调用了stop方法

public class MainActivity extends AppCompatActivity {

private MediaRecorder grabacion;
private String archivoSalida = null;
private Button btn_recorder;

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

    btn_recorder = (Button)findViewById(R.id.btn_rec);

    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO,}, 1000);
    }
}

public void Recorder(View view){
    if(grabacion == null){
        archivoSalida = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Grabacion.mp3";
        grabacion = new MediaRecorder();
        grabacion.setAudioSource(MediaRecorder.AudioSource.MIC);
        grabacion.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        grabacion.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        grabacion.setOutputFile(archivoSalida);

        try{
            grabacion.prepare();
            grabacion.start();
        } catch (IOException e){
        }

        btn_recorder.setBackgroundResource(R.drawable.rec);
        Toast.makeText(getApplicationContext(), "Grabando...", Toast.LENGTH_SHORT).show();
    } else if(grabacion != null){
        grabacion.stop();
        grabacion.release();
        grabacion = null;
        btn_recorder.setBackgroundResource(R.drawable.stop_rec);
        Toast.makeText(getApplicationContext(), "Grabación finalizada", Toast.LENGTH_SHORT).show();
    }
}

public void reproducir(View view) {

    MediaPlayer mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(archivoSalida);
        mediaPlayer.prepare();
    } catch (IOException e){
    }

    mediaPlayer.start();
    Toast.makeText(getApplicationContext(), "Reproduciendo audio", Toast.LENGTH_SHORT).show();
}}
这是清单文件:

<?xml version="1.0" encoding="utf-8"?>
谢谢

for The
stop()
方法声明它将抛出一个
IllegalStateException

如果在start()之前调用它

因为这似乎是唯一一次抛出此错误,所以这很可能也是您的案例中发生的情况

看看您的
Recorder()
方法。调用
stop()
的唯一时间是变量不为null时。这意味着您的实例已正确初始化。 但是,由于引发了异常,这意味着即使您的变量引用的是
MediaRecorder
的实例,它也没有启动

要了解原因,请查看启动
MediaRecorder的代码:

    try {
        grabacion.prepare();
        grabacion.start();
    } catch (IOException e){
    }
当它被放置在try-catch构造中时,catch块实际上并不包含任何代码,从而导致忽略任何错误。 因此,您遇到的问题是由
grabacion.prepare()引起的
grabacion.start()未成功,导致记录器无法启动

假定
start()
仅根据其, 调用
prepare()
应该是问题的原因。这也符合我自己的经验,因为调用
prepare()
时可能会出现很多错误。以下是它根据中的描述所做的工作:

准备记录器以开始捕获和编码数据。必须在设置所需的音频和视频源、编码器、文件格式等之后,但在start()之前调用此方法

所以,正如你所知,现在要为我找出确切的原因并不容易。但是,我要补充的是,您使用了API 29中的
Environment.getExternalStorageDirectory()
,以改善用户隐私。虽然这可能是你的问题,但我不能完全肯定


为了准确地找出错误的原因,您应该利用您正在尝试捕获的
IOException
。例如,您可以记录其堆栈跟踪,以了解更多有关该问题的信息。

您是对的,我在一台使用Android 8而不是10的设备上尝试了该应用程序,它运行得非常好,因此我更改了另一台设备的.getExternalStorageDirectory()方法,现在它可以在Android 8和10中运行,谢谢你的帮助,它终于起作用了,真是太好了。我很高兴能帮上忙:)。
E/MediaRecorder: stop called in an invalid state: 4
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.recorder, PID: 5386
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:7870)
        at android.widget.TextView.performClick(TextView.java:14970)
        at android.view.View.performClickInternal(View.java:7839)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29363)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7948)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:7870) 
        at android.widget.TextView.performClick(TextView.java:14970) 
        at android.view.View.performClickInternal(View.java:7839) 
        at android.view.View.access$3600(View.java:886) 
        at android.view.View$PerformClick.run(View.java:29363) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7948) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 
     Caused by: java.lang.IllegalStateException
        at android.media.MediaRecorder._stop(Native Method)
        at android.media.MediaRecorder.stop(MediaRecorder.java:1440)
        at com.example.recorder.MainActivity.Recorder(MainActivity.java:55)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
        at android.view.View.performClick(View.java:7870) 
        at android.widget.TextView.performClick(TextView.java:14970) 
        at android.view.View.performClickInternal(View.java:7839) 
        at android.view.View.access$3600(View.java:886) 
        at android.view.View$PerformClick.run(View.java:29363) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7948) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 
I/Process: Sending signal. PID: 5386 SIG: 9
    try {
        grabacion.prepare();
        grabacion.start();
    } catch (IOException e){
    }