在捕获单个图像并返回父活动后释放相机实例

时间:2015-02-08 12:03:18

标签: android android-activity android-camera onactivityresult

我正在尝试调用camera实例,捕获图像并返回父活动。我可以创建并调用camera实例,捕获并存储图像,但相机的活动不会退出。

Preview活动会创建一个相机实例,并实现onPause()onResume()resetCam()等方法。代码是:

        //capture button
        buttonClick.setOnClickListener(new OnClickListener(){
                        public void onClick(View v) {
                            camera.takePicture(shutterCallback, rawCallback, pngCallback);
                       }
        }


    protected void onResume() {
            super.onResume();
            int numCams = Camera.getNumberOfCameras();
            if(numCams > 0){
                try{
                    camera = Camera.open(0);
                    camera.startPreview();
                    preview.setCamera(camera);
                } catch (RuntimeException ex){
                    Toast.makeText(ctx, getString(R.string.camera_not_found), Toast.LENGTH_LONG).show();
                }
            }
        }

        @Override
        protected void onPause() {
            if(camera != null) {
                camera.stopPreview();
                preview.setCamera(null);
                camera.release();
                camera = null;
            }
            super.onPause();
        }

        private void resetCam() {
            camera.startPreview();
            preview.setCamera(camera);
        }

ShutterCallback shutterCallback = new ShutterCallback() {
        public void onShutter() {
            }
    };

    PictureCallback rawCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            }
    };

    PictureCallback pngCallback = new PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {

//save the iamge here

                resetCam();

            Log.d(TAG, "onPictureTaken - png");
        }
    };

在单个捕获事件之后,控件应返回到父活动PhotoCapture,该活动通过以下方式调用Preview

Intent intent = new Intent(PhotoCapture.this,Preview.class);
                startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

并执行相同的onActivityResult()

如何释放camera实例以安全退出?

我想要返回保存的图像路径。

谢谢!

修改

我试着打电话给finish();这样:

    buttonClick.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v) {
                    camera.takePicture(shutterCallback, rawCallback, pngCallback);
                    Log.d("Tag","4");
                    finish();
                }
            });

我将Log.d()用于获取控制流程:

ShutterCallback shutterCallback = new ShutterCallback() {
        public void onShutter() {
                Log.d("Tag","1");
        }
    };

    PictureCallback rawCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d("Tag","2");
        }
    };

    PictureCallback pngCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d("Tag","3");
            //save image
            resetCam();
            Log.d(TAG, "onPictureTaken - png");
        }
    };

日志是:

02-19 14:00:28.046    4680-4680/preview.preview D/Tag﹕ 4
02-19 14:00:38.414    4680-4686/preview.preview W/Camera﹕ Camera server died!

Tag:1或Tag:2或Tag:3没有日志!

因此,在捕获/存储实际图像之前,活动已完成。

即使我设置(result_code = OK),图像也不会被保存。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

在拍完照片后拨打finish(),它将退出当前活动,您将返回上一个活动。

答案 1 :(得分:1)

当您拍完照片并准备好返回您的通话活动时,您必须拨打此代码

setResult(RESULT_OK);

然后

finish();

这将使用resultCode = RESULT_OK

返回您的通话活动

答案 2 :(得分:0)

要完成活动,您必须在启动活动后使用finish()方法,或者在开始活动之前可以包含标记。