![](/img/trans.png)
[英]IllegalStateException [start called in an invalid state: 1] on restarting Android MediaRecorder
[英]Android MediaRecorder IllegalStateException. start()/stop() called in invalid state
我正在构建一个应用程序,在该应用程序中,我需要在显示视频时录制相机而不进行预览。
我正在使用已弃用的类android.hardware.camera
因为它适合我的需要。 我一直有 MediaRecorder 类的问题。
我设置了 myMediaRecorder 所需的所有参数,如下面的代码所示:
if (myMediaRecorder == null) {
myMediaRecorder = new MediaRecorder();
}
try {
if (myCamera == null) {
myCamera = Camera.open(Integer.parseInt(getFrontFacingCameraId()));
}
myCamera.unlock();
myMediaRecorder.setCamera(myCamera);
//myCamera.lock();
myMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
myMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
myMediaRecorder.setVideoSize(myVideoView.getWidth(),myVideoView.getHeight());
myMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); myMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); myMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
myMediaRecorder.setOutputFile(new FileOutputStream(outputFile.getAbsolutePath()).getFD());
myMediaRecorder.setVideoFrameRate(30);
myMediaRecorder.prepare();
} catch (Exception ex) {
ex.printStackTrace();
}
然后我添加侦听器来处理与我的播放视频和录制内容相关的触发器,如您所见。
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
myVideoView.requestFocus();
myVideoView.start();
myMediaRecorder.start();
playButton.setText("isRecording");
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
myVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
myMediaRecorder.stop();
myMediaRecorder.release();
myMediaRecorder=null;
myCamera.release();
myCamera=null;
playButton.setText("stopped Recording");
}
});
我的目标是 SDK 版本 25,minSdkVersion 设置为 23。我在清单和编码中明确声明了以下权限:
相机、录制音频、写入和读取外部存储。
加上我的清单中的那些:
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />
我的主要问题是我无法访问 MediaRecorder 当前状态,这导致我在调用 start 和 stop 方法时进入非法状态。
你可以在这里阅读我的堆栈跟踪:
E/ExtendedMediaRecorder: start called in an invalid state: 2 mIsPaused = 0
W/System.err: java.lang.IllegalStateException
W/System.err: at android.media.MediaRecorder.start(Native Method)
W/System.err: at com.reacteam.reactoplayer.PlayerActivity$1.onClick(PlayerActivity.java:125)
W/System.err: at android.view.View.performClick(View.java:5205)
W/System.err: at android.view.View$PerformClick.run(View.java:21164)
W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:167)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5514)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/MediaPlayer: info/warning (3, 0)
E/ExtendedMediaRecorder: stop called in an invalid state: 2
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.reacteam.reactoplayer, PID: 19210
java.lang.IllegalStateException
at android.media.MediaRecorder.stop(Native Method)
at com.reacteam.reactoplayer.PlayerActivity$2.onCompletion(PlayerActivity.java:135)
at android.widget.VideoView$3.onCompletion(VideoView.java:483)
at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2821)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:167)
at android.app.ActivityThread.main(ActivityThread.java:5514)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我绝望地为我的 MediaRecorder 声明尝试了很多不同的架构。
我可能错过了一些重要的东西,但我主要的失望是无法以这种方式访问 MediaRecord
if (myMediaRecord.getState() == "PREPARED") {
myMediaRecord.start();
}
请注意,我在 prepare() 语句之后添加了我的听众。
我的问题是,我做错了什么吗? 我是否被迫使用 Camera2 Api,但我觉得它的一些优点很复杂? 有没有办法在没有 MediaRecorder Api 的情况下记录相机输入?
只需按照官方媒体记录文件。 您的代码可能未遵循说明。 函数调用顺序必须正确。
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(_path);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.