Camera API 介绍系列文章:
Android Camera之 --- Camera API说明(一)
Android Camera之 --- Camera API说明(二)
Android Camera之 --- Camera API说明(三)
推荐大家浏览Android源码最便利的方法:
从Android5.0开始google引入新的Camera API,位于:http://androidxref.com/5.0.0_r2/xref/frameworks/base/core/java/android/hardware/camera2/
后续我会写几篇关于Camera2 API的分析文章。
Android Camera API说明:
Camera API基本上有三大功能,预览;拍照;录像,所有对Camera API的调用基本上就是围绕这三种功能来进行的。
Android Camera API 实现位于/frameworks/base/core/java/android/hardware/Camera.java
首先,在开发Camera相关APP时需要在AndroidManifest.xml中申请camera使用权限以及其他有关camera的feature,如:
uses-permission android:name="android.permission.CAMERA"
uses-feature android:name="android.hardware.camera"
uses-feature android:name="android.hardware.camera.autofocus"
预览操作:
1. 通过调用open()或者open(int cameraId)来获取Camera实例;
2. 通过调用getParameters()来获取camera默认的参数集;
3. 根据需要通过Parameters封装的函数来更改必要的参数;
4. 设置参数调用setParameters(Camera.Parameters);
5. 必须调用setPreviewDisplay(SurfaceHolder)来设置预览图像的显示,若没有Surface,camera不能开始预览;
6. 调用startPreview()来开始预览;
7. 想要停止预览则调用stopPreview();
拍照操作:
1. 确保camera已经在预览模式;
2. 调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)来拍照;
3. 等待takePicture()函数设置的callback返回图片数据;
4. 当takePicture()函数被调用后,预览画面就会停止,想要继续预览或者拍照,则必须调用startPreview()开始预览;
视频录制操作:
1. 确保Camera已经在预览模式;
2. 调用unlock()通知cameraserver允许mediaserver进程访问Camera;
3. 调用MediaRecorder初始化MediaRecorder实例并设置相应的音频视频参数;
4. 调用MediaRecorder.setCamera(Camera)接口将此camera实例做为video datasource;
5. 调用MediaRecorder相关的函数进行视频录制;
6. 结束视频录制也是由MediaRecorder相关的函数来控制;
7. 调用reconnect()接口来对camera实例重新上锁;
介绍完大致的操作步骤后首先对Camera的内部类进行说明:
public static class CameraInfo {
public static final int CAMERA_FACING_BACK = 0; // 在屏幕的相反侧,也就是代表后置摄像头
public static final int CAMERA_FACING_FRONT = 1; // 在屏幕的同侧,代表前置摄像头
public int facing; // 上面定义的两选其一,代表次摄像头的相对位置
public int orientation; // 相机的转角,一般有0,90,180,270.
public boolean canDisableShutterSound; // 是否支持拍照关闭声音
};
若要想Camera参数设置生效,则必须调用Camera.setParameters(Camera.Parameters)接口来设置修改后的Camera参数集。例如:
当调用Camera.Parameters.setWhiteBalance()时,并不能让WB生效,必须通过调用Camera.setParameters(Camera.Parameters)来让修改后的参数集设置生效;不同的硬件有不同的参数功能,比如所支持的preview size和flash mode都是有所不同的,使用者必须首先获取所支持的参数信息,进一步根据所支持的信息来设置相应的参数。下面介绍camera的参数集Camera.Parameters内部类:
@Deprecated
public class Parameters {
// 从下面的定义可以看出每一个参数都是通过key-value来存储的,代表了camera硬件设备的特性和性能,也有一部分是作为设置参数存在的
// Parameter keys to communicate with the camera driver.
// 预览画面大小,一般有默认值,可以通过调用getPreviewSize()来获取默认值,
// 使用者调用getSupportedPreviewSizes()获取所支持的preview size,进而调用setPreviewSize(int width, int height)来设置预览大小;
private static final String KEY_PREVIEW_SIZE = "preview-size";
// previewCallback()返回数据格式,可以通过调用getPreviewFormat()来获取默认值,
// 使用者调用getSupportedPreviewFormats()获取所支持的颜色格式,进而调用setPreviewFormat(int pixel_format)来设置callback数据格式;
private static final String KEY_PREVIEW_FORMAT = "preview-format";
// 预览帧率,使用者调用getPreviewFrameRate()来获取默认的预览帧率,
// 使用者可以通过getSupportedPreviewFrameRates()来获取所支持的预览帧率,进而调用
private static final String KEY_PREVIEW_FRAME_RATE = "preview-frame-rate";
// 用来替代KEY_PREVIEW_FRAME_RATE而设置的,因为camera设备的帧率是不固定的,根据光照条件的差异,曝光时间是不同的,若想得到较好的图像质量,
// 则必须牺牲帧率,所以此处的预览帧率是一个范围,有最大值和最小值之分,可以通过getPreviewFpsRange(int[] range)来获取默认值,
// getSupportedPreviewFpsRange()来获取所支持的预览帧率范围,进而通过setPreviewFpsRange(int min, int max)来设置预览帧率范围,
private static final String KEY_PREVIEW_FPS_RANGE = "preview-fps-range";
// 拍照图片大小,可以通过getPictureSize()来获取默认值,
// 使用者getSupportedPictureSizes()来获取所支持的拍照图片大小,进而通过setPictureSize(int width, int height)来设置拍照图片大小
private static final String KEY_PICTURE_SIZE = "picture-size";
// 拍照图像格式,可以通过getPictureFormat()来获取默认的拍照图片格式,
// 使用者通过getSupportedPictureFormats()来获取所支持的拍照图片格式,进而通过setPictureFormat(int pixel_format)来设置拍照图片格式
private static final String KEY_PICTURE_FORMAT = "picture-format";
// 获取所支持的拍照Thumbnail大小,分别为width和height
private static final String KEY_JPEG_THUMBNAIL_SIZE = "jpeg-thumbnail-size";
// 拍照Thumbnail宽度,通过getJpegThumbnailSize()获取,通过setJpegThumbnailSize(int width, int height)来设置
private static final String KEY_JPEG_THUMBNAIL_WIDTH = "jpeg-thumbnail-width";
// 拍照Thumbnail高度,通过getJpegThumbnailSize()获取,通过setJpegThumbnailSize(int width, int height)来设置
private static final String KEY_JPEG_THUMBNAIL_HEIGHT = "jpeg-thumbnail-height";
// EXIF Thumbnail 图像质量级别[0~100], 100为最佳图像质量,
// 可通过getJpegThumbnailQuality()和setJpegThumbnailQuality(int quality)来获取和设置Thumbnail图像的质量;
private static final String KEY_JPEG_THUMBNAIL_QUALITY = "jpeg-thumbnail-quality";
// 拍照图片JPEG图像质量, 通过setJpegQuality(int quality)和getJpegQuality()来设置或获取图片质量
private static final String KEY_JPEG_QUALITY = "jpeg-quality";
// 设置图像旋转角度,0,90,180,270.
private static final String KEY_ROTATION = "rotation";
// GPS纬度信息,用于拍照
private static final String KEY_GPS_LATITUDE = "gps-latitude";
// GPS经度信息,用于拍照
private static final String KEY_GPS_LONGITUDE = "gps-longitude";
// GPS海拔信息,用于拍照
private static final String KEY_GPS_ALTITUDE = "gps-altitude";
// GPS时间信息,用于拍照
private static final String KEY_GPS_TIMESTAMP = "gps-timestamp";
// GPS信息处理方式,用于拍照
private static final String KEY_GPS_PROCESSING_METHOD = "gps-processing-method";
// 相机WB模式,可通过getSupportedWhiteBalance()来获取所支持的模式,
// 模式有:AUTO,INCANDESCENT,FLUORESCENT,WARM_FLUORESCENT,DAYLIGHT,CLOUDY_DAYLIGHT,TWILIGHT,SHADE,
// 通过String getWhiteBalance()和setWhiteBalance(String value)来获取或设置WB模式
private static final String KEY_WHITE_BALANCE = "whitebalance";
// 预览色彩效果,可通过getSupportedColorEffects()获取所支持的色彩效果,
// 色彩效果有NONE,MONO,NEGATIVE,SOLARIZE,SEPIA,POSTERIZE,WHITEBOARD,BLACKBOARD,AQUA,
// 通过getColorEffect()和setColorEffect(String value)来获取和设置色彩效果
private static final String KEY_EFFECT = "effect";
// antibanding 模式, 可以通过getSupportedAntibanding()来获取所支持的antibanding,
// Antibanding模式有:AUTO,50HZ,60HZ,OFF
// 可以通过getAntibanding()和setAntibanding(String antibanding)来获取或者设置Antibanding模式,
private static final Strin