Capturing Photos之Controlling the Camera

本文详细介绍了如何在Android应用中使用相机API,包括初始化相机、预览画面、拍照及释放资源等关键步骤,并提供了实现这些功能的具体代码示例。
可以直接使用API来控制camera.
一般在onCreate中new一个thread或者在onResume中来调用camera.open()来打开一个camera.
private boolean safeCameraOpen(int id) {
    boolean qOpened = false;


    try {
        releaseCameraAndPreview();
        mCamera = Camera.open(id);
        qOpened = (mCamera != null);
    } catch (Exception e) {
        Log.e(getString(R.string.app_name), "failed to open Camera");
        e.printStackTrace();
    }


    return qOpened;
}


private void releaseCameraAndPreview() {
    mPreview.setCamera(null);
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}
需要一个preview class才能来时preview.
class Preview extends ViewGroup implements SurfaceHolder.Callback {


    SurfaceView mSurfaceView;
    SurfaceHolder mHolder;


    Preview(Context context) {
        super(context);


        mSurfaceView = new SurfaceView(context);
        addView(mSurfaceView);


        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
}
要实现SurfaceHolder.Callback来将camera的数据传送会application.
那要如何开始preview 呢?
先调用setPreviewDisplay 后再调用startPreview
public void setCamera(Camera camera) {
    if (mCamera == camera) { return; }


    stopPreviewAndFreeCamera();


    mCamera = camera;


    if (mCamera != null) {
        List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();
        mSupportedPreviewSizes = localSizes;
        requestLayout();


        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }


        // Important: Call startPreview() to start updating the preview
        // surface. Preview must be started before you can take a picture.
        mCamera.startPreview();
    }
}


可以调用setCameraDisplayOrientation() 来是设置camera的方向.
调用 Camera.takePicture() 来照相。可以创建Camera.PictureCallback和Camera.ShutterCallback 作为camera.takePicture的参数.
如果想连续的获取图片,可以调用Camera.PreviewCallback()方法.
可以在shutter button回调函数中重新开始preview
@Override
public void onClick(View v) {
    switch(mPreviewState) {
    case K_STATE_FROZEN:
        mCamera.startPreview();
        mPreviewState = K_STATE_PREVIEW;
        break;


    default:
        mCamera.takePicture( null, rawCallback, null);
        mPreviewState = K_STATE_BUSY;
    } // switch
    shutterBtnConfig();
}
当不使用camera的时候,应该要停止preview 释放camera资源.
public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    if (mCamera != null) {
        // Call stopPreview() to stop updating the preview surface.
        mCamera.stopPreview();
    }
}


/**
 * When this function returns, mCamera will be null.
 */
private void stopPreviewAndFreeCamera() {


    if (mCamera != null) {
        // Call stopPreview() to stop updating the preview surface.
        mCamera.stopPreview();


        // Important: Call release() to release the camera for use by other
        // applications. Applications should release the camera immediately
        // during onPause() and re-open() it during onResume()).
        mCamera.release();


        mCamera = null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值