Android Camera之"/>
Android Camera之
Camera API 介绍系列文章:
Android Camera之 --- Camera API说明(一)
Android Camera之 --- Camera API说明(二)
Android Camera之 --- Camera API说明(三)
推荐大家浏览Android源码最便利的方法:
/
从Android5.0开始google引入新的Camera API,位于:.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内部类:
@Deprecatedpublic 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和heightprivate 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 String KEY_ANTIBANDING =
更多推荐
Android Camera之
发布评论