最近倒腾了自定义相机的一些东西,中间也遇到了很多麻烦,查阅了很多别人写的博客,也看了相关的API,进过几番折腾最后代码才调试成功。写这篇博客,一方面是想把自己的东西分享给大家,能够一起交流;另一方面,也想通过这种方法加强自己记忆。
首先创建一个基本的camera预览类CameraPreview。参考点击打开链接,该类继承SurfaceView.Callback接口类,并且需要实现里面的接口方法以便监听SurfaceView控件的创建以及销毁事件的回调,在回调方法中关联相机预览显示。并且要在相应得布局文件中添加SurfaceView控件。
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback{
private Camera mCamera;
private SurfaceHolder mHolder;
public CameraPreview(Context context, Camera camera,SurfaceView surfaceView) {
super(context);
mCamera = camera;
mHolder = surfaceView.getHolder();
mHolder.addCallback(this);//实现surfaceHolder.Callback接口
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
showCameraView(mCamera,mHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mCamera != null) {
mCamera.stopPreview();
if (mHolder != null) {
showCameraView(mCamera,mHolder);
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//clearCamera();//使用构造器这种方法的时候此处不能clearCamera
}
private void showCameraView(Camera camera, SurfaceHolder holder)
{
try {
camera.setPreviewDisplay(holder);
/**眼镜可以不用旋转*/
//camera.setDisplayOrientation(90);//旋转90度
camera.startPreview();
}catch (Exception e){
e.printStackTrace();
}
}
/**释放相机的内存*/
private void clearCamera(){
// 释放hold资源
if (mCamera != null) {
// 停止预览
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
// 释放相机资源
mCamera.release();
mCamera = null;
}
}
}
第二步是新建CustomCamera活动,这里面要完成以下几个步骤:
1、检查设备是否有相机
/** 检查是否存在相机*/
private boolean checkCameraHardware(Context context) {
if (context.getPackageManage