Java – Calling MediaRecorder in Android Studio crashes the application

Calling MediaRecorder in Android Studio crashes the application… here is a solution to the problem.

Calling MediaRecorder in Android Studio crashes the application

I

was trying to create a class to set up and start recording, but the app crashes when I click the button. I isolate the problem to where I set the parameters for MediRecorder.

private void startRec() throws IOException {
    if (mrecorder!=null)
        mrecorder.release();

mrecorder= new MediaRecorder();

->  mrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    /*
    mrecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mrecorder.setOutputFile(MFILE);

mrecorder.prepare();
    mrecorder.start();

*/
}

When executing a line with an arrow above the beginning of a comment, it crashes. I’ve also added the following permissions to list:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

Any help is greatly appreciated.

UPDATED LOGCAT

[ 05-12 00:39:13.299 30086:30158 D/]
ro.exynos.dss enabled: 0
05-12 00:39:13.309 30086-30158/record66.record6 D/mali_winsys:new_window_surface returns 0x3000,[1440×2560]-format: 1
05-12 00:39:13.319 30086-30086/record66.record6 W/DisplayListCanvas: DisplayListCanvas starts on an unbound (bind) RenderNode (no mOwningView)
05-12 00:39:13.319 30086-30158/record66.record6 D/libGLESv1: DTS_GLAPI: DTS is not allowed for package: record66.record6
05-12 00:39:13.359 30086-30086/record66.record6 D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 96 – 0, 0) vi=Rect(0, 96 – 0, 0) or=1
05-12 00:39:13.389 30086-30086/record66.record6 I/Timeline: Timeline: Activity_idle ID: android.os.BinderProxy@682466c Time: 234401322
05-12 00:39:15.749 30086-30086/record66.record6 D/ViewRootImpl: ViewPostImeInputStage processPointer 0
05-12 00:39:15.879 30086-30086/record66.record6 D/ViewRootImpl: ViewPostImeInputStage processPointer 1
05-12 00:39:15.929 30086-30086/record66.record6 D/AndroidRuntime: Shut down the VM
05-12 00:39:15.939 30086-30086/record66.record6 E/AndroidRuntime: Fatal Exception: Primary
Process: record66.record6, PID: 30086
java.lang.RuntimeException: setAudioSource failed.
In android.media.MediaRecorder._setAudioSource (native method)
In android.media.MediaRecorder.setAudioSource(MediaRecorder.java:488)
in record66.record6.MainActivity.startRec(MainActivity.java:58)
in record66.record6.MainActivity.onClick(MainActivity.java:94)
In android.view.View.performClick (View.java:5697)
In android.widget.TextView.performClick(TextView.java:10815)
In android.view.View$PerformClick.run(View.java:22526)
In android.os.Handler.handleCallback (Handler.java:739)
In android.os.Handler.dispatchMessage (Handler.java:95)
In android.os.Looper.loop (Looper.java:158)
In android.app.ActivityThread.main(ActivityThread.java:7229)
In java.lang.reflect.Method.invoke( native method)
In com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
In com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
05-12 00:39:17.909 30086-30086/record66.record6 I/Process: Send signal. PID:30086 SIG:9

Solution

See what< a href="http://developer.android.com/tools/debugging/debugging-studio.html#systemLog" rel="noreferrer noopener nofollow">logcat is.

Let us know what error you encountered. So it can help.


package com.example.dhrupalpatel.test;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import java.io.File;
import java.io.IOException;

public class MainActivity extends Activity implements View.OnClickListener{
MediaRecorder mrecorder;
boolean mStartRecording=false;

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

start =(Button)findViewById(R.id.start);
    stop =(Button)findViewById(R.id.stop);
    start.setOnClickListener(this);
    stop.setOnClickListener(this);

}

private void startRec() throws IOException {
   boolean mExternalStorageAvailable = false;
    boolean mExternalStorageWriteable = false;
    String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
         We can read and write the media
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
         We can only read the media
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
         Something else is wrong. It may be one of many other states, but all we need
          to know is we can neither read nor write
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }
    File sdCardDirectory= Environment
            .getExternalStorageDirectory();
    if(mExternalStorageAvailable && !sdCardDirectory.exists())
    {
        sdCardDirectory.mkdir();
    }
    File f= new File(sdCardDirectory.getPath()+"/"+System.currentTimeMillis()+".mp3");
    if( mrecorder == null ) {
        mrecorder = new MediaRecorder();
        mrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mrecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mrecorder.setOutputFile(f.getPath());
        mrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    }
    if(!mStartRecording) {

try {
            mrecorder.prepare();
            mrecorder.start();
            mStartRecording = true;
        }  catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void stopRec() throws IOException {

if(mStartRecording) {
        mStartRecording = false;
        mrecorder.stop();
        mrecorder.reset();
        mrecorder.release();
        mrecorder = null;
    }
}

@Override
public void onClick(View v) {
    switch (v.getId())
    {
        case R.id.start:
            try {
                startRec();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        case R.id.stop:
            try {
                stopRec();
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
    }

}
}

Related Problems and Solutions