use*_*390 22 android android-camera
我一直在尝试camera2 API.我已下载代码
https://developer.android.com/samples/Camera2Video/index.html了解它的工作原理.它工作正常,直到我停止录制.当我停止录制时,它会运行以下代码.
private void stopRecordingVideo() {
// UI
mIsRecordingVideo = false;
mBtn_Video.setText(R.string.record);
// Stop recording
try {
mMediaRecorder.stop();
mMediaRecorder.reset();
}
catch (Exception e) {
e.printStackTrace();
}
Activity activity = getActivity();
if (null != activity) {
System.out.println("file " + getVideoFile(activity));
Toast.makeText(activity, "Video saved: " + getVideoFile(activity),
Toast.LENGTH_SHORT).show();
}
startPreview();
Run Code Online (Sandbox Code Playgroud)
在mMediaRecorder.stop(); 它抛出以下错误
01-12 16:24:23.115 2161-2200/com.cameratwoapi E/Surface? queueBuffer: error queuing buffer to SurfaceTexture, -19
01-12 16:24:23.135 2161-2200/com.cameratwoapi E/EGL_emulation? tid 2200: swapBuffers(285): error 0x3003 (EGL_BAD_ALLOC)
01-12 16:24:23.197 2161-2200/com.cameratwoapi E/CameraDeviceGLThread-0? Received exception on GL render thread:
java.lang.IllegalStateException: swapBuffers: EGL error: 0x3003
at android.hardware.camera2.legacy.SurfaceTextureRenderer.checkEglError(SurfaceTextureRenderer.java:487)
at android.hardware.camera2.legacy.SurfaceTextureRenderer.swapBuffers(SurfaceTextureRenderer.java:480)
at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:681)
at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)
任何想法我做错了什么.我花了几个小时但找不到任何解决方案.
编辑 - 我正在使用geneymotion模拟器.我正在使用的路径
file /storage/emulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4
谢谢
小智 26
我的解决方案是将void stopRecordingVideo()更改为如下:
private void stopRecordingVideo() {
// UI
mIsRecordingVideo = false;
mButtonVideo.setText(R.string.record);
// Added by Ben Ning, to resolve exception issue when stop recording.
try {
mPreviewSession.stopRepeating();
mPreviewSession.abortCaptures();
} catch (CameraAccessException e) {
e.printStackTrace();
}
// Stop recording
mMediaRecorder.stop();
mMediaRecorder.reset();
Run Code Online (Sandbox Code Playgroud)
}
关键是:
try {
mPreviewSession.stopRepeating();
mPreviewSession.abortCaptures();
} catch (CameraAccessException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
小智 5
private void stopRecordingVideo() {
// UI
mIsRecordingVideo = false;
mButtonVideo.setText(R.string.record);
// Added by Ben Ning, to resolve exception issue when stop recording.
try {
mPreviewSession.stopRepeating();
mPreviewSession.abortCaptures();
} catch (CameraAccessException e) {
e.printStackTrace();
}
// Stop recording
mMediaRecorder.stop();
mMediaRecorder.reset();
Activity activity = getActivity();
if (null != activity) {
Toast.makeText(activity, "Video saved: " + getVideoFile(activity),
Toast.LENGTH_SHORT).show();
}
startPreview();
}
Run Code Online (Sandbox Code Playgroud)
这为我工作。
小智 4
调用后mMediaRecorder.stop()总是IllegalStateException会抛出异常。我注意到,在状态更改为错误的设备上INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,CameraDevice立即onError()调用CameraDevice.StateCallback.
在您引用的示例中,onError()关闭相机并完成活动,因此只需更改onError()为重新打开相机,如下所示:
@Override
public void onError(CameraDevice cameraDevice, int error) {
// mCameraOpenCloseLock.release();
// cameraDevice.close();
// mCameraDevice = null;
// Activity activity = getActivity();
// if (null != activity) {
// activity.finish();
// }
closeCamera();
openCamera(mTextureView.getWidth(), mTextureView.getHeight());
}
Run Code Online (Sandbox Code Playgroud)
在那里进行一些检查以确保如果确实发生错误,注释掉的代码会被调用,而不是进入一遍又一遍地尝试打开相机的循环,这也是一个好主意。
在配备 Android 5.0.2 的 Moto G 第二代上进行了测试
| 归档时间: |
|
| 查看次数: |
11689 次 |
| 最近记录: |