问题
I try to record the audio, only the audio, and I get this error on android 4.1.2 but not on 4.3:
Here is the code:
private void startRecord(){
on_record = true;
final boolean exists = (new File(Environment.getExternalStorageDirectory() + File.separator + NOTAY)).exists();
if (!exists) {new File(Environment.getExternalStorageDirectory() + File.separator + "Test").mkdirs();}
final boolean existAud = (new File(android.os.Environment.getExternalStorageDirectory() + File.separator + NOTAY + File.separator + "Audio")).exists();
if (!existAud) {new File(Environment.getExternalStorageDirectory() + File.separator + "Test" + File.separator + "Audio").mkdirs();}
final EditText editTitle= (EditText) findViewById(R.id.editTitle);
final String title = editTitle.getText().toString();
final String audioName = getDate(System.currentTimeMillis()).replaceAll(" ", "_");
currentAudioPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ File.separator
+ "Test"
+ File.separator
+ "Audio"
+ File.separator
+ System.currentTimeMillis() + "-" + audioName + ".3gpp";
if(title.length() == 0)
editTitle.setText(audioName);
Recorder = new MediaRecorder();
Recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
Recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
Recorder.setOutputFile(currentAudioPath);
try {
Recorder.prepare();
} catch (IOException e) {
}
Recorder.start();
}
private void saveRecord(){
Recorder.stop();
Recorder.release();
Recorder = null;
on_record = false;
currentAudioPath = NO_AUDIO;
}
And here the logs:
10-24 08:34:02.777: E/MediaRecorder(13491): start called in an invalid state: 4
10-24 08:34:02.777: D/AndroidRuntime(13491): Shutting down VM
10-24 08:34:02.777: W/dalvikvm(13491): threadid=1: thread exiting with uncaught exception (group=0x40e5b440)
10-24 08:34:02.823: E/AndroidRuntime(13491): FATAL EXCEPTION: main
10-24 08:34:02.823: E/AndroidRuntime(13491): java.lang.IllegalStateException
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.media.MediaRecorder.start(Native Method)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.androtest.audio.startRecord(AudioActivity.java:357)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.androtest.audio.onOptionsItemSelected(AudioActivity.java:307)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.app.Activity.onMenuItemSelected(Activity.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.view.View.performClick(View.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.view.View$PerformClick.run(View.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.os.Handler.handleCallback(Handler.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.os.Handler.dispatchMessage(Handler.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.os.Looper.loop(Looper.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at android.app.ActivityThread.main(ActivityThread.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at java.lang.reflect.Method.invokeNative(Native Method)
10-24 08:34:02.823: E/AndroidRuntime(13491): at java.lang.reflect.Method.invoke(Method.java:511)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-24 08:34:02.823: E/AndroidRuntime(13491): at dalvik.system.NativeStart.main(Native Method)
I've read hundreds of thread on this error but I can't find anything that solves my issue...
回答1:
I had the same error and solved it by fixing the path of the file. So if you have invalid state 4, check if you have output file path set and if it really exists.
回答2:
Ok I find out what was my problem. This:
final String audioName = getDate(System.currentTimeMillis()).replaceAll(" ", "_");
Return a string that contains this character: ":" Replacing it by:
final String audioName = (getDate(System.currentTimeMillis()).replaceAll(" ", "_")).replaceAll(":", "-");
Solved my issue.
回答3:
I had the same issue and then realized the path to my output file was incorrect. Correcting the path solved my issue.
回答4:
You need to call reset after initializing Recorder
Recorder = new MediaRecorder();
Recorder.reset();
Recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
Recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
Recorder
.setOutputFile(currentAudioPath);
try {
Recorder.prepare();
} catch (IOException e) {
}
Recorder.start();
来源:https://stackoverflow.com/questions/19558812/android-mediarecorder-start-failed-in-invalid-state-4