开启自定义摄像头
2016-07-02 22:25
423 查看
上一篇讲的是如何调用系统的摄像头并拍照:
Android使用摄像头,分别获取照片的缩略图与原图
这次是开启一个自定义的摄像头,这样可以在摄像界面做一些自定义的操作:
实现功能如下:
单机左图中的“custom camera“ 后出现右图中的视图,实际情况中surfaView中是摄像头的取景,单机capture则拍照
首先设定”custom camera“这个button的onclick事件
然后写CustomCamera这个类
代码结束。
现在理一下写这个类的整体思路:
1、继承callback类,通过surfaceView创建surfaceHolder
2、分别写:
getCamera()—–获取Camera对象
setStartPreview()—–获取相机视图
capture()——获取相机视图后拍照功能,当然此处暂时不写
releaseCamera()—–用于释放相机资源
3、基于步骤2中方法将相机的运作与Activity生命周期关联起来
4、完成 SurfaceHolder.Callback接口的三个方法,目的是将相机是视图的运作与surfaceView的状态对应起来
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的状态对应起来
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories