停止MediaRecorder时java.lang.IllegalStateException

我知道这个问题已经问了很多,但没有一个能解决我的问题。当MediaRecorder录制音频时,它工作正常,但是当按下按钮停止播放时,它会抛出java.lang.IllegalStateException。先感谢您。 这是代码:

File rootPath = new File(Environment.getExternalStorageDirectory(),"Recording");
    if(!rootPath.exists()) {
        rootPath.mkdirs();
    }

    buttonStart = (ImageButton) findViewById(R.id.RecordingButton);
    buttonStop = (Button) findViewById(R.id.StopRecordingButton);

    buttonStart.setEnabled(true);
    buttonStop.setEnabled(false);

    buttonStart.setOnClicklistener(new View.OnClicklistener() {
                @Override
                public void onClick(View view) {

            if(checkPermission()) {
                datetimeLog = DateString();
                AudioSavePathInDevice = Environment.getExternalStorageDirectory().getabsolutePath() + "/Recording/" + datetimeLog + "_AudioRecording.3gp";
                try {
                    mediaRecorder=new MediaRecorder();
                    mediaRecorder.setaudioSource(MediaRecorder.AudioSource.MIC);
                    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    mediaRecorder.setaudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
                    mediaRecorder.setOutputFile(AudioSavePathInDevice);
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                buttonStart.setEnabled(false);
                buttonStop.setEnabled(true);

                Toast.makeText(Mainactivity.this,"Recording Started...",Toast.LENGTH_LONG).show();
            } else {
                requestPermission();
            }
        }
    });

    buttonStop.setOnClicklistener(new View.OnClicklistener() {
        @Override
        public void onClick(View view) {
            System.out.println(mediaRecorder);
            mediaRecorder.stop();
            //mediaRecorder.reset();
            mediaRecorder.release();
            mediaRecorder = null;
            buttonStart.setEnabled(true);
            buttonStop.setEnabled(false);
            Toast.makeText(Mainactivity.this,"Recording Stopped",Toast.LENGTH_LONG).show();
            showAddItemDialog(Mainactivity.this);
        }
    });
}

private String DateString() {
    Date c = Calendar.getInstance().getTime();
    SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy-h-m-s");
    String formattedDate = df.format(c);
    return formattedDate;
}

private void showAddItemDialog(final Context c) {
    final EditText taskEditText = new EditText(c);
    AlertDialog dialog = new AlertDialog.Builder(c)
            .setTitle("Save Recording as?")
            .setMessage("Name of Audio Recording (Make this a short)")
            .setView(taskEditText)
            .setPositiveButton("Save",new DialogInterface.OnClicklistener() {
                @Override
                public void onClick(DialogInterface dialog,int which) {
                    logName = taskEditText.getText().toString().replaceAll("\n","");
                    //AudioSavePathInDevice
                    //datetimeLog
                    //save to file
                    String toWrite = logName + "," + AudioSavePathInDevice + "," + datetimeLog + "\n";
                    myFile = new File(Environment.getExternalStorageDirectory().getabsolutePath() + "/Recording/Logs.txt");
                    try {
                        buff = new BufferedWriter ( new FileWriter ( myFile,true));
                        buff.append(toWrite);
                        buff.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).setNegativeButton("Cancel",int which) {
                    File file = new File(AudioSavePathInDevice);
                    boolean deletedfile = file.delete();
                }
            }).create();
    dialog.show();
}

private void requestPermission() {
    activityCompat.requestPermissions(Mainactivity.this,new
            String[]{WRITE_EXTERNAL_STORAGE,RECORD_AUDIO,WAKE_LOCK},RequestPermissionCode);
}

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[],int[] grantResults) {
    switch (requestCode) {
        case RequestPermissionCode:
            if (grantResults.length> 0) {
                boolean StoragePermission = grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED;
                boolean RecordPermission = grantResults[1] ==
                        PackageManager.PERMISSION_GRANTED;

                if (StoragePermission && RecordPermission) {
                    Toast.makeText(Mainactivity.this,"Permission Granted",Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(Mainactivity.this,"Permission Denied",Toast.LENGTH_LONG).show();
                }
            }
            break;
    }
}

public boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(getapplicationContext(),WRITE_EXTERNAL_STORAGE);
    int result1 = ContextCompat.checkSelfPermission(getapplicationContext(),RECORD_AUDIO);
    int result2 = ContextCompat.checkSelfPermission(getapplicationContext(),WAKE_LOCK);
    return result == PackageManager.PERMISSION_GRANTED &&
            result1 == PackageManager.PERMISSION_GRANTED && result2 == PackageManager.PERMISSION_GRANTED;
}

}

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

这是错误消息:

E/MediaRecorder: stop called in an invalid state: 4
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ee.project,PID: 29167
java.lang.IllegalStateException
    at android.media.MediaRecorder.stop(Native Method)
    at com.example.project.Mainactivity$2.onClick(Mainactivity.java:114)
    at android.view.View.performClick(View.java:7125)
    at android.view.View.performClickinternal(View.java:7102)
    at android.view.View.access$3500(View.java:801)
    at android.view.View$PerformClick.run(View.java:27336)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.activityThread.main(activityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
xp10000 回答:停止MediaRecorder时java.lang.IllegalStateException

我真的不知道为什么这可以解决我的问题,但是将Environment.getExternalStorageDirectory().getAbsolutePath() + "/Recording/Logs.txt");的每个实例更改为getFilesDir() + "/Recording/Logs.txt")可以解决我的问题。

本文链接:https://www.f2er.com/3135584.html

大家都在问