0

I'm trying to develop an app that records everything that is displayed on the screen by MediaRecorder. But the app crashes when mediaRecorder is stopped.

When I start recording everything is fine, but the problem occurs when the recording is stopped.

Edit I'm using android 9.0 API 28

Here's my code to record the screen and then save the video to play it later:

public class MainActivity extends AppCompatActivity {

Button Start , Stop;
MediaRecorder mediaRecorder;
String Save = null;
int Width , Height;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    Height = displayMetrics.heightPixels;
    Width = displayMetrics.widthPixels;

    Start = (Button)findViewById(R.id.Start);
    Stop = (Button)findViewById(R.id.Stop);
    
    Save = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
            +new StringBuilder("/").append(new SimpleDateFormat("MM-yyyy-hh_mm_ss")
            .format(new Date())).append(".mp4").toString();
    
    if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD_AUDIO)
            +ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{
                        Manifest.permission.RECORD_AUDIO
                        ,Manifest.permission.WRITE_EXTERNAL_STORAGE
                },100);
    }
    Start.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onClick(View v) {

            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mediaRecorder.setVideoEncodingBitRate(512 * 1000);
            mediaRecorder.setVideoSize(Width,Height);
            mediaRecorder.setAudioEncodingBitRate(16);
            mediaRecorder.setAudioSamplingRate(44100);
            mediaRecorder.setOutputFile(Save);
            try {
                mediaRecorder.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaRecorder.start();
            Start.setEnabled(false);
            Stop.setEnabled(true);
        }
    });
    Stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mediaRecorder != null) {
                mediaRecorder.stop();
                mediaRecorder.reset();
                mediaRecorder = null;
            }
            Start.setEnabled(true);
            Stop.setEnabled(false);
        }
    });
}
}

My Logcat:

Process: com.example.recordvoice, PID: 5633
java.lang.RuntimeException: stop failed.
    at android.media.MediaRecorder.stop(Native Method)
    at com.example.recordvoice.MainActivity$2.onClick(MainActivity.java:94)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    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:858)

Does anyone know how to fix this?

Amy
  • 1,114
  • 13
  • 35

1 Answers1

0

Try changing the:

Stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mediaRecorder != null) {
                mediaRecorder.stop();
                mediaRecorder.reset();
                mediaRecorder = null;
            }
            Start.setEnabled(true);
            Stop.setEnabled(false);
        }
    });

To:

Stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (mediaRecorder != null) {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
        }
        Start.setEnabled(true);
        Stop.setEnabled(false);
    }
});

All I've changed is the mediaRecorder.reset(); to mediaRecorder.release();

Let me know if it works

Amy
  • 1,114
  • 13
  • 35