cameraview icon indicating copy to clipboard operation
cameraview copied to clipboard

小米5plus 不能切换前置摄像头

Open tqdream opened this issue 7 years ago • 5 comments

小米5plus 不能切换前置摄像头

tqdream avatar Aug 02 '17 06:08 tqdream

I think you should use English here :\ No one is responsible for spending time learning Chinese. And I think some details(like the version and the ROM of your phone) are needed.


Translation: Front camera is not working on Xiaomi 5 Plus.

daquexian avatar Aug 02 '17 06:08 daquexian

你好,我发现您项目中有一个方法写的有问题,Camera1.java文件152行代码

    @Override
    Set<AspectRatio> getSupportedAspectRatios() {
        SizeMap idealAspectRatios = mPreviewSizes;
        for (AspectRatio aspectRatio : idealAspectRatios.ratios()) {
            if (mPictureSizes.sizes(aspectRatio) == null) {
                idealAspectRatios.remove(aspectRatio);
            }
        }
        return idealAspectRatios.ratios();
    }

从集合中删除元素时有问题。

移除元素应该这样:

    @Override
    Set<AspectRatio> getSupportedAspectRatios() {
        SizeMap idealAspectRatios = mPreviewSizes;
        Iterator<AspectRatio> iterator = idealAspectRatios.ratios().iterator();
        while (iterator.hasNext()) {
            AspectRatio aspectRatio = iterator.next();
            if (mPictureSizes.sizes(aspectRatio) == null) {
                iterator.remove();
            }
        }
        return idealAspectRatios.ratios();
    }

tqdream avatar Aug 07 '17 09:08 tqdream

小米5S已经是6.0之上的手机了,Build.Version.SDK_INT>=21的话,需要通过CameraManager的openCamera方法设置前置摄像头和后置摄像头,同时cameraId为String类型,前置为"1",后置为"0". mCameraManager.openCamera(cameraId,mCameraDeviceCallback,null); 加我的QQ群交流技术: 490113234

TheMelody avatar Sep 04 '17 15:09 TheMelody

你好,我发现您项目中有一个方法写的有问题,Camera1.java文件152行代码

    @Override
    Set<AspectRatio> getSupportedAspectRatios() {
        SizeMap idealAspectRatios = mPreviewSizes;
        for (AspectRatio aspectRatio : idealAspectRatios.ratios()) {
            if (mPictureSizes.sizes(aspectRatio) == null) {
                idealAspectRatios.remove(aspectRatio);
            }
        }
        return idealAspectRatios.ratios();
    }

从集合中删除元素时有问题。

移除元素应该这样:

    @Override
    Set<AspectRatio> getSupportedAspectRatios() {
        SizeMap idealAspectRatios = mPreviewSizes;
        Iterator<AspectRatio> iterator = idealAspectRatios.ratios().iterator();
        while (iterator.hasNext()) {
            AspectRatio aspectRatio = iterator.next();
            if (mPictureSizes.sizes(aspectRatio) == null) {
                iterator.remove();
            }
        }
        return idealAspectRatios.ratios();
    }

Camera2代码中collectCameraInfo()方法里也有这样的问题:

        for (AspectRatio ratio : mPreviewSizes.ratios()) {
            if (!mPictureSizes.ratios().contains(ratio)) {
                mPreviewSizes.remove(ratio);
            }
        }

应该改为:

        Iterator<AspectRatio> iterator = mPreviewSizes.ratios().iterator();
        while (iterator.hasNext()) {
            AspectRatio ratio = iterator.next();
            if (!mPictureSizes.ratios().contains(ratio)) {
                iterator.remove();
            }
        }

jimmysuncpt avatar Dec 15 '18 08:12 jimmysuncpt

有个临时的解决方案: 在Camera2.java的chooseCameraIdByFacing()方法里368行前后:

                if (level == null ||
                        level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
                    continue;
                }

改成以下代码即可解决小米5s不能切换前置摄像头问题:

                if (level == null || 
                        level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
                    if (!Build.MODEL.equals("MI 5s")) {
                        continue;
                    }
                }

如果发现其它机型也出现类似问题,可以再增加条件判断。

jimmysuncpt avatar Dec 16 '18 09:12 jimmysuncpt