Android Camera之 --- Camera API说明(一)

Camera API 介绍系列文章:

Android Camera之 --- Camera API说明(一)

Android Camera之 --- Camera API说明(二)

Android Camera之 --- Camera API说明(三)



推荐大家浏览Android源码最便利的方法:

http://androidxref.com/


从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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值