开启自定义摄像头

来源:互联网 发布:java 获取类所在jar包 编辑:程序博客网 时间:2024/05/01 08:14

上一篇讲的是如何调用系统的摄像头并拍照:
Android使用摄像头,分别获取照片的缩略图与原图
这次是开启一个自定义的摄像头,这样可以在摄像界面做一些自定义的操作:
实现功能如下:
单机左图中的“custom camera“ 后出现右图中的视图,实际情况中surfaView中是摄像头的取景,单机capture则拍照
图1 图2

首先设定”custom camera“这个button的onclick事件

public void customCamera(View view){        Intent intent = new Intent(this,CustomCamera.class);        startActivity(intent);    }

然后写CustomCamera这个类

/** * 我的理解:SurfaceHold.Callback是监听surfaceView状态的一个接口,她有三个方法对应surfaceView的三个状态 */public class CustomCamera extends Activity implements SurfaceHolder.Callback {    private SurfaceView mSurface;    private SurfaceHolder mHolder;    private Camera  mCamera;    /**     * 此处onCreate方法主要是通过surfaceView创建一个surfaceHold,这之后就没有surfaceView什么事了     *      */    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.custom_camera);        mSurface = (SurfaceView) findViewById(R.id.surfaceView);        mHolder = mSurface.getHolder();        mHolder.addCallback(this);      }            /**     * get the Camera instance     *     * @return     */    public Camera getCamera() {        Camera camera;        try {            camera = Camera.open();        } catch (Exception e) {            camera = null;            e.printStackTrace();        }        return camera;    }    public void capture(View view) {   //用于设定拍照事件,此处暂时不写    }    /**     * start to preview the content of camera     */    public void setStartPreview(Camera camera,SurfaceHolder surfaceHolder) {        try {            camera.setPreviewDisplay(surfaceHolder);            camera.setDisplayOrientation(90);//set the angle of the camera            camera.startPreview();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * like the inputstream ,camera also need to be release     */    public void releaseCamera() {        if (mCamera != null) {            mCamera.setPreviewCallback(null);            mCamera.stopPreview();            mCamera.release();            mCamera = null;        }    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        setStartPreview(mCamera,mHolder);    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        mCamera.stopPreview();        setStartPreview(mCamera,mHolder);    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        releaseCamera();    }    /**     * 以下两个方法作用:将camera与Activity生命周期关联,合理使用相机资源     */    @Override    protected void onResume() {        super.onResume();        if (mCamera == null) {            mCamera = getCamera();            if (mHolder != null) {                setStartPreview(mCamera,mHolder);            }        }    }    @Override    protected void onPause() {        super.onPause();        releaseCamera();    }}

代码结束。
现在理一下写这个类的整体思路:
1、继承callback类,通过surfaceView创建surfaceHolder
2、分别写:
getCamera()—–获取Camera对象
setStartPreview()—–获取相机视图
capture()——获取相机视图后拍照功能,当然此处暂时不写
releaseCamera()—–用于释放相机资源
3、基于步骤2中方法将相机的运作与Activity生命周期关联起来
4、完成 SurfaceHolder.Callback接口的三个方法,目的是将相机是视图的运作与surfaceView的状态对应起来

0 0
原创粉丝点击