Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Camera 2 Api_Android_Android Camera - Fatal编程技术网

Android Camera 2 Api

Android Camera 2 Api,android,android-camera,Android,Android Camera,我一直在尝试Camera2API。我已经从 了解它是如何工作的。在我停止录音之前一切正常。当我停止录制时,它运行以下代码 private void stopRecordingVideo() { // UI mIsRecordingVideo = false; mBtn_Video.setText(R.string.record); // Stop recording try { mMedia

我一直在尝试Camera2API。我已经从

了解它是如何工作的。在我停止录音之前一切正常。当我停止录制时,它运行以下代码

 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();
在一个记录器上。停止();它抛出以下错误

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)
知道我做错了什么吗。我花了几个小时,但找不到任何解决办法

编辑-我正在使用geneymotion emulator。我正在使用的路径

file/storage/simulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4


在调用mMediaRecorder.stop()之后,谢谢您

。始终会引发一个
非法状态异常
。我注意到,在带有
INFO\u支持的\u硬件级\u遗留
的设备上,
CameraDevice
将状态更改为错误,立即调用
CameraDevice.StateCallback中的
onError()

在您引用的示例中,
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());
}
在那里进行一些检查也是一个好主意,以确保如果真的发生了错误,将调用注释掉的代码,而不是进入一个试图反复打开相机的循环


在Moto G第二代上进行测试,使用Android 5.0.2

我的解决方案是将void stopRecording video()更改如下:

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();
}

关键是:

    try {
    mPreviewSession.stopRepeating();
    mPreviewSession.abortCaptures();
} catch (CameraAccessException e) {
    e.printStackTrace();
} 

这取决于您对CameraCaptureSession和MediaRecorder所做的操作,但是当您调用
mMediaRecorder.stop()
时,我认为它正在破坏用于相机预览会话的曲面,这会导致此错误,因为文档中说

一旦停止录制,您将不得不重新配置它,就像它刚刚构建一样

因此,如果调用
PreviewSession.abortCaptures()
mPreviewSession.stopRepeating();
,从我收集的内容来看,这不是必需的),它会停止相机向记录器表面发送输出,这将允许您停止MediaRecorder而不会出现问题

PreviewSession.abortCaptures()
不会立即停止相机预览输出,因此您可能会发现需要在


这对我很有用。

在我的例子中,我使用
TimerTask
处理程序。直接指向mMediaRecorder.stop()的错误。所以我用这个方法

final Handler mTimerHandler = new Handler(Looper.getMainLooper());

        mIsRecordingVideo = false;
        // Stop recording
        try {
            mPreviewSession.stopRepeating();
            mPreviewSession.abortCaptures();
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        try{
            Timer timer = new Timer();
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    mTimerHandler.post(new Runnable() {
                        @Override
                        public void run() {

                            mMediaRecorder.stop();
                            mMediaRecorder.reset();
                        }

                    });
                }
            };
            timer.schedule(timerTask,30);
        }catch(RuntimeException e){
            Log.e("----------------","---->>>>>>>>>"+e);
            e.printStackTrace();
        }

EGL错误0x3003表示“错误分配”。内存中发生了错误…您是否尝试过调试并查看是什么特定调用导致了上述问题?另外,由于您可能正在保存视频,您是否确保已将
写入外部存储
权限添加到应用程序清单文件中?谢谢,@Willis我确实在清单文件中写入了权限。我正在使用此路径存储文件/storage/emulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4。此问题发生在mMediaRecorder.stop()上;您是否已尝试在实际设备上运行该应用程序?我过去在尝试使用emulator保存文件时遇到过问题,即使它是允许的。我使用Nexus 7(硬件)-我有这个错误它在我的项目中工作,但是你能解释一下为什么在关闭录像机之前必须停止预览两次吗?
final Handler mTimerHandler = new Handler(Looper.getMainLooper());

        mIsRecordingVideo = false;
        // Stop recording
        try {
            mPreviewSession.stopRepeating();
            mPreviewSession.abortCaptures();
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        try{
            Timer timer = new Timer();
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    mTimerHandler.post(new Runnable() {
                        @Override
                        public void run() {

                            mMediaRecorder.stop();
                            mMediaRecorder.reset();
                        }

                    });
                }
            };
            timer.schedule(timerTask,30);
        }catch(RuntimeException e){
            Log.e("----------------","---->>>>>>>>>"+e);
            e.printStackTrace();
        }