如何在surfaceview android中捕获图像后重新加载相机?

Vic*_*cky 1 android surfaceview android-camera

我正在创建一个应用程序,我在surfaceview中使用相机.问题是在相机中拍摄照片后,它会继续显示拍摄的照片无法拍摄下一张照片,但拍摄的图像会存储在文件路径中.我需要的是在surfaceview中捕获图像后,它应该自动重新加载相机以拍摄下一个.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);
    preview = (SurfaceView) findViewById(R.id.preview);
    previewHolder = preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    button = (Button)findViewById(R.id.capture);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            camera.takePicture(null, null, photoCallback);

        }
    });

    }

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        try {
            camera.setPreviewDisplay(previewHolder);
            camera.setDisplayOrientation(90);
            camera.startPreview();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();
        camera = null;

    }
};

Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera1) {

        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0,
                data.length);
        Matrix matrix = new Matrix();
        matrix.postRotate(90);
        Bitmap rotatedBitmap = Bitmap.createBitmap(bitmapPicture, 0, 0,
                bitmapPicture.getWidth(), bitmapPicture.getHeight(),
                matrix, true);

        String root = Environment.getExternalStorageDirectory().toString();
        File myDir = new File(root + "/saved_images");
        myDir.mkdirs();
        Date d = new Date();
          CharSequence dateOfShot  = DateFormat.format("ddMMyyhhmmss", d.getTime());

        String fname = "Image-" + dateOfShot + ".jpg";

        File file = new File(myDir, fname);
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            Log.e(TAG,Log.getStackTraceString(e));
            e.printStackTrace();
        }
        camera.stopPreview();
        previewHolder.removeCallback(surfaceCallback);
        camera.release();
        camera = Camera.open();
        previewHolder.addCallback(surfaceCallback);         
    }
};
Run Code Online (Sandbox Code Playgroud)

Mar*_*lon 6

你需要添加

camera.startPreview();
Run Code Online (Sandbox Code Playgroud)

到onPictureTaken方法的结尾

@Override
public void onPictureTaken(byte[] data, Camera camera) {

    //your existing code here

    camera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)

因为takePicture行为:

此方法仅在预览处于活动状态时(startPreview()之后)有效.拍摄图像后将停止预览; 如果呼叫者想要重新开始预览或拍摄更多照片,则必须再次调用startPreview().不应在start()和stop()之间调用它.

调用此方法后,在返回JPEG回调之前,不得调用startPreview()或拍摄另一张照片.