公司一直在做一款好玩的应用名叫Funny, 是一个以萌和可爱为主的图片社区,P图工具(欢迎大家下载玩耍哈),刚开始调用的相机是调用系统的相机, 这肯定不能满足一款应用的需求,So我开始了从零的自定义相机,发现github csdn等等上面关于自定义相机的资料不是很多,当然也有比较好的,这里我也是从开始能预览到后面的一些细节处理踩了一些坑,我会一步一步的分享粗来,大家也看到了这篇是Camera(一), 现在谷歌开始推荐使用Camera2了 , 我后续也会继续研究,然后写出来, 下面就开始从头开始做个自己的相机吧。
获取相机和释放相机
首先相机实例只能有一个,拍照之后一定要释放,那么它也有了自己的生命周期, 首先获取相机,这里传入一个ID,这个id可以设前置摄像头和后置摄像头,后面博客我会加入代码
/**
* 获取Camera实例
* @return
*/
private Camera getCamera(int id){
Camera camera = null;
try{
camera = Camera.open(id);
}catch (Exception e){
}
return camera;
}
/**
* 释放相机资源
*/
private void releaseCamera(){
if(mCamera != null){
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
使用之后释放相机资源,这里这样写是有原因的,一步都不能少,我有时候会忘记写mCamera.setPreviewCallback(null); 会报Method called after release 错误, 因为相机要实时的预览,那普通的View就不能满足绘制的要求了,这里要用的一个双缓冲机制的SurfaceView,下面我们要做的就是将Camera和SurfaceView绑定起来, 那就需要另一个类了 SurfaceHolder, 这里要特别提的是CameraUtil.getInstance().setCameraDisplayOrientation(this, mCameraId, camera); , 后面我会把源码地址写上, 由于安卓系统默认预览都是横着的,基本操作的是camera.setDisplayO