美文网首页android视频Android
Android Camera2学习笔记

Android Camera2学习笔记

作者: _飞翔的荷兰豆 | 来源:发表于2016-08-09 21:24 被阅读6393次

    前言

    自从Android 5.0之后,Android有了新的Camera Api,但是现在网上的资料很少,只有谷歌的官方示例以及SDK文档,一些相关的资料,但由于想做一个相机App,所以我决定研究这个Api。

    在Camera2的Api中,将一个Camera Device比作管道,输入一个个请求,返回包含一些图像的元数据和一系列的图像缓冲,Camera Device对于一系列的请求是按顺序处理。

    我们可以获取的Camera Device不止一个,可能会有许多个,现在大家基本上的手机都会有2个Camera Device,一个前置的和一个后置的,如果我们还在手机上连了其他的摄像头外设,我们可以获取的Camera Device就会更多了。

    那么,我们要怎么获取这些Camera Device对象呢?在Android中内置了一个CameraManager的系统级服务,我们可以这样子轻松获取

    CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    

    选择合适的相机

    每个不同的Camera Device都包含有关于这个设备的一些特性参数,比如输出图像的大小,是否支持闪光灯等信息,这些信息都通过键值对的形式储存在CameraCharacteristics对象中,这个CameraCharacteristics对象由CameraManager管理,根据每只Camera Device的Id获取

    for (String cameraId : cameraManager.getCameraIdList()) {
        CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
    }
    

    当获取到CameraCharacteristics对象后,我们要根据需要使用的功能选择合适的相机。
    比如是否需要闪光灯支持

     Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
    mFlashSupported = available == null ? false : available;
    

    是否为前置摄像头

     Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
    

    以及获取图片输出的尺寸和预览画面输出的尺寸

    StreamConfigurationMap configurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    
    if (configurationMap == null) continue;
    
    //获取图片输出的尺寸
    configurationMap.getOutputSizes(ImageFormat.JPEG);
    //获取预览画面输出的尺寸,因为我使用TextureView作为预览
    configurationMap.getOutputSizes(SurfaceTexture.class)
    

    等等,都储存在CameraCharacteristics对象中,我们需要选择出符合我们条件要求的相机,并记录下相应的CameraId。

    打开相机

    获取了CameraId后,就可以根据CameraId打开相应的Camera,获取CameraDevice对象。

    CameraManager manager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE);
    try {
        manager.openCamera(mCameraId, mStateCallback, mMainHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    

    查看API,openCamera需要三个参数


    device-2016-07-31-215411.png

    相关文章

      网友评论

      • 眷卿三世:请问楼主遇没遇到过,拍照的时候需要在imgageReader的回调函数中重新开启camera,预览才能正常显示?如果不重新开启,预览界面就卡住了
      • 9df2a6e99159:哥们儿怎么解决预览拉伸的问题啊?还有横竖屏切换的时候拉伸变形的问题
        9df2a6e99159:@_Nightmare 我几乎是抄的官方的DEMO为啥官方的就可以啊:sob:
        _飞翔的荷兰豆:@海边的卡夫卡Fu 参考fotoapparat库中的实现
      • ink9979:怎样切换摄像头
      • Bugme:你好,我想问下,camera1中有两个回调函数是可以获取byte数据的,camera2是用什么回调函数获取?
      • InnerNight:我的app,一旦把屏幕横过来,显示的图像就旋转了90°,这要怎么解决?
        InnerNight:@飞翔的荷兰豆 谢谢
        _飞翔的荷兰豆:@InnerNight 在一开始要计算角度,对TextureView进行角度变换,具体可以参考https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java 中的 configureTransform 方法

      本文标题:Android Camera2学习笔记

      本文链接:https://www.haomeiwen.com/subject/mwmdsttx.html