第一次拍摄后Android自定义相机无响应

时间:2015-04-17 07:37:09

标签: android camera

最近,我制作了一个自定义相机应用程序用于测试目的,我遇到了一个看似简单的小问题,但我很难解决。 问题是,当我点击按钮拍摄快照时,相机会在第一次拍摄时成功拍摄照片,但是,当我第二次点按该按钮时,相机根本没有响应(不是&#39) ;崩溃,但无法拍摄照片) 我已经在下面设置了示例代码,我想知道我实现的某些代码是否存在一些结构性错误,或者我是否只是在做一个偏离主题的菜鸟。

    preview = new Preview(this,
                (SurfaceView) findViewById(R.id.CameraFragment));
        FrameLayout frame = (FrameLayout) findViewById(R.id.preview);
        frame.addView(preview);
        preview.setKeepScreenOn(true);
        fotoButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    //take the picture 
                    takeFocusedPicture();

                } catch (Exception e) {

                }
                // exitButton.setClickable(false);
                fotoButton.setClickable(false);
                // progressLayout.setVisibility(View.VISIBLE);

            }
        });
    }


    @Override
    protected void onResume() {
        super.onResume();
        // TODO Auto-generated method stub
        if (camera == null) {
            camera = Camera.open();
            camera.startPreview();
            camera.setErrorCallback(new ErrorCallback() {
                public void onError(int error, Camera mcamera) {

                    camera.release();
                    camera = Camera.open();
                    Log.d("Camera died", "error camera");

                }
            });
        }
        if (camera != null) {
            if (Build.VERSION.SDK_INT >= 14)
                setCameraDisplayOrientation(context,
                        CameraInfo.CAMERA_FACING_BACK, camera);
            preview.setCamera(camera);
        }
    }


//This method allows you to take the image after the camera autofocuses
    Camera.AutoFocusCallback mAutoFocusCallback = new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {

            try {
                // camera.takePicture(mShutterCallback, null, jpegCallback);
                shutter(); // Method one shutt(1)
            } catch (Exception e) {

            }

        }
    };



    //This method will activate the shutter class 
    public void shutter() {
        //passies the auto focus listener  parameter = 2 
        this.camera.autoFocus(this.mAutofocusListener);
    }


    private Camera.AutoFocusCallback mAutofocusListener = new Camera.AutoFocusCallback() {

        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            // camera.autoFocus(null); Takes the picture after the device succeeds in auto focus 

            //passes in two methos as a parameter 
             //First parameter  = 3 Second paramter = 4 
            camera.takePicture(mShutterListener, null, mPictureListener);
        }
    };


    private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() {

        @Override
        public void onShutter() {

        }
    };

    //method for the picture callback parameter = 4
    private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {


        //I think you better alter this part 
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
//returns the image data as a byte
            //if image data exists 
        //  if (data != null) {
                camera.startPreview();

                //passes in the byte data into the makeRotateImage function to rotate the image that has been taken 
                makeRotateImage(mOwner, data, 512 * 512); //maximum pixel willl be 262144

            //}
        }
    };

    public void takeFocusedPicture() {
        //sets up the mAutoFocusCallback method as a parameter 
        camera.autoFocus(mAutoFocusCallback);

    }

1 个答案:

答案 0 :(得分:0)

拍完照片后,请刷新你的表面视图&停止预览并释放相机并重新开始该过程。

@Override
public void onPictureTaken(byte[] data, Camera camera) {
    try {
        camera.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }
    camera.setPreviewDisplay("Our SurfaceView Holder");
    camera.startPreview();
}