您的位置:首页 > 移动开发 > Android开发

开启自定义摄像头

2016-07-02 22:25 423 查看
上一篇讲的是如何调用系统的摄像头并拍照:

Android使用摄像头,分别获取照片的缩略图与原图

这次是开启一个自定义的摄像头,这样可以在摄像界面做一些自定义的操作:

实现功能如下:

单机左图中的“custom camera“ 后出现右图中的视图,实际情况中surfaView中是摄像头的取景,单机capture则拍照





首先设定”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的状态对应起来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息