Camera的简单使用浅析
由于最近工作上用到android.hardware.Camera这个类,于是简单的学习了一些基本用法。
首先注意:Camera这个类在API21以后就不推荐使用了,官方提供了一个新的类名叫:Camera2,其中包含了新的回调机制,感兴趣的朋友可以仔细研究研究。
Camera官方API Guide:无墙又懒得打开本地doc的朋友请戳:
http://www.android-doc.com/guide/topics/media/camera.html
其中描述了使用Camera用以拍照的步骤:
1. 从open (int cameraId)获取Camera的实例,在Android2.3以后可以传入相应的cameraId值来开启所选相机。注意:使用前需要调用getNumberOfCameras ()方法以获取当前设备拥有摄像头数量以确保设备拥有多枚摄像头可用;
2. 如需要的话,可以先调用getParameters()获取当前(默认)的settings,并定义Camera.Parameters对象,调用setParameters(Camera.Parameters)来进行Camera的配置。例如setWhiteBalance(String) 、setFocusMode(String value)等,之后需要跟上setParameters(Camera.Parameters)以确保设置成功;
3. 调用setDisplayOrientation(int)旋转屏幕,因为在Portrait模式下,摄像头采集的图像是逆时针旋转90度的。注意
:该方法仅仅对于屏幕显示(也就是UI)有影响,不会影响摄像头采集的原始帧,所以如果使用onPreviewFrame(byte[] data, Camera)这个方法获取原始帧做Rotate的朋友,请不要在此类的官方API中再浪费时间了。
4. 将完全初始化的SurfaceHolder传入到setPreviewDisplay(SurfaceHolder)中,没有surface的话,相机不会开启preview预览;
5. 调用startPreview()用以更新preview的surface,必须要在拍照之前start Preview;
6. 接着,调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)方法用以拍照,callback会提供图像数据;
7. 拍照后,preview display会停止,如果需要的话,再次使用startPreview()用以take more photos;
8. 调用stopPreview()停止preview surface的更新;
9. 调用release()方法用以释放相机的控制权,不然会导致之后使用摄像头的应用(包括本应用)打开摄像头的时候Crash。并且一般来说APP都应该在onPause()之后立刻进行release()的操作。
关于Camera的几个注意事项:
先说说我踩的坑:
- 关于摄像头采集原始帧的方向问题:如果需要用到原始帧的朋友应该知道,Android(这里说的是API21以下)的相机采集方向始终都是landscape模式。所以官方提供的几个旋转的方法如:setDisplayOrientation(int), setCameraDisplayOrientation(), changeOrientationListener()等 都对onPreviewFrame中的数据没有影响的。)
官方说明:This does not affect the order of byte array passed in onPreviewFrame(byte[], Camera)
, JPEG pictures, or recorded videos. This method is not allowed to be called during preview.