美文网首页音视频方向我爱编程
Android 6.0获取摄像头支持分辨率列表并格式化输出

Android 6.0获取摄像头支持分辨率列表并格式化输出

作者: rakuen | 来源:发表于2018-04-13 11:03 被阅读0次

    Android开发中经常需要获取摄像头所支持的分辨率列表,然而获取的参数列表是List形式,而且每个分辨率并不是按大小进行排列,不方便查看和返回,所以写了一个重新排列并且格式化输出的方法。

    Camera.Parameters有三个方法获取分辨率:

    获取摄像头支持的视频分辨率列表
    getSupportedVideoSizes();

    获取摄像头支持的图像分辨率列表
    getSupportedPictureSizes();

    获取摄像头预览分辨率(一般是预设的推荐分辨率)
    getSupportedPreviewSizes();

    理论上需要获取预览分辨率和支持分辨率两个值,用来保证设置摄像头的分辨率后不会出现一些玄学概率问题(通常是摄像头推荐的分辨率和最高分辨率的冲突),在实际开发中我用getSupportedVideoSizes()和getSupportedPreviewSizes()死活获取不到值,只能通过getSupportedPictureSizes()拉取列表,获取到的分辨率也是一致的。

    需要注意的是,CPU型号也会影响分辨率的获取,同一个摄像头在不同CPU上拉取到的支持分辨率是不一样的,所以还需要对不同CPU机型的摄像头分辨率进行适配。

    数据定义

        public static List<Camera.Size> supportedVideoSizes;
        public static List<Camera.Size> previewSizes;
    

    获取摄像头信息,然后循环取最大的width和height,(最大值一般是List的第一个元素,可以直接get(0)),但是有些摄像头拉去到的list是乱序的,所以对他们进行重新按大小排序,方便取值。width*height就是摄像头的像素,例如500百万像素。

        public String getCameraInfo(){
    
            int cameracount = 0;//摄像头数量
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();  //获取摄像头信息
            cameracount = Camera.getNumberOfCameras();
            Log.i("CameraTest","摄像头数量"+String.valueOf(cameracount));
            for(int cameraId=0; cameraId<Camera.getNumberOfCameras(); cameraId++)
            {
                Camera.getCameraInfo( cameraId, cameraInfo);  
                Camera camera = Camera.open(cameraId); //开启摄像头获得一个Camera的实例
                Camera.Parameters params = camera.getParameters();  //通过getParameters获取参数
                supportedVideoSizes = params.getSupportedPictureSizes();
                previewSizes = params.getSupportedPreviewSizes();
                camera.release();//释放摄像头
    
                //重新排列后设下摄像头预设分辨率在所有分辨率列表中的地址,用以选择最佳分辨率(保证适配不出错)
                int index=bestVideoSize(previewSizes.get(0).width);
                Log.i("CameraTest", "预览分辨率地址: " + index );
                if (null != previewSizes && previewSizes.size() > 0){  //判断是否获取到值,否则会报空对象
                    Log.i("CameraTest", "摄像头最高分辨率宽: " + String.valueOf(supportedVideoSizes.get(0).width) );  //降序后取最高值,返回的是int类型
                    Log.i("CameraTest", "摄像头最高分辨率高: " + String.valueOf(supportedVideoSizes.get(0).height) );
                    Log.i("CameraTest", "摄像头分辨率全部: " + cameraSizeToSting( supportedVideoSizes) );  
                }else{
                    Log.i("CameraTest", "没取到值啊什么鬼" );
                    Log.i("CameraTest", "摄像头预览分辨率: " + String.valueOf(previewSizes.get(0).width) ); 
                }
            }
            return cameraSizeToSting( supportedVideoSizes );
        }
    

    重新排列分辨率列表

        //重新排列获取到的分辨率列表
        public static int bestVideoSize(int _wid) {
    
            //降序排列
            Collections.sort(supportedVideoSizes, new Comparator<Camera.Size>() {
                @Override
                public int compare(Camera.Size lhs, Camera.Size rhs) {
                    if (lhs.width > rhs.width) {
                        return -1;
                    } else if (lhs.width == rhs.width) {
                        return 0;
                    } else {
                        return 1;
                    }
                }
            });
            for (int i = 0; i < supportedVideoSizes.size(); i++) {
                if (supportedVideoSizes.get(i).width < _wid) {
                    return i;
                }
            }
            return 0;
        }
    

    格式化输出成常见的宽x高格式

        //分辨率格式化输出String值
        public static String cameraSizeToSting(Iterable<Camera.Size> sizes)
        {
            StringBuilder s = new StringBuilder();
            for (Camera.Size size : sizes)
            {
                if (s.length() != 0)
                    s.append(",\n");
                s.append(size.width).append('x').append(size.height);
            }
            return s.toString();
        }
    

    使用完相机之后一定要记得用 Camera.release()来释放相机的实例,否则后续调用相机的请求(系统内其他app或本应用)都会失败,导致Camera.open()方法报错“Failed to connect to camera service”。所以同理,出现这种问题的时候也可以排查系统中其他apps是否正在占用摄像头没有释放。

    在Android 6.0版本的摄像头开发中,使用Camera.open()方法时,需要在onCreate()方法中加入下面的权限申请,否则同样会报错"Failed to connect to camera service"

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //android6.0需要加申请权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[] {Manifest.permission.CAMERA}, 1);
                }
            }
        }
    

    运行结果如下


    屏幕快照 2018-04-13 11.49.32.png

    相关文章

      网友评论

        本文标题:Android 6.0获取摄像头支持分辨率列表并格式化输出

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