CameraConfigurationManager.java 源代码


package cn.bingoogolapple.qrcode.core;

import android.content.Context;
import android.graphics.Point;
import android.hardware.Camera;
import android.view.WindowManager;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

final class CameraConfigurationManager {
    private Point mCameraResolution;
    private final Context mContext;
    private Point mPreviewResolution;

    public CameraConfigurationManager(Context context) {
        this.mContext = context;
    }

    public void initFromCameraParameters(Camera camera) {
        Point screenResolution = BGAQRCodeUtil.getScreenResolution(this.mContext);
        Point point = new Point();
        point.x = screenResolution.x;
        point.y = screenResolution.y;
        if (BGAQRCodeUtil.isPortrait(this.mContext)) {
            point.x = screenResolution.y;
            point.y = screenResolution.x;
        }
        this.mPreviewResolution = getPreviewResolution(camera.getParameters(), point);
        if (BGAQRCodeUtil.isPortrait(this.mContext)) {
            this.mCameraResolution = new Point(this.mPreviewResolution.y, this.mPreviewResolution.x);
        } else {
            this.mCameraResolution = this.mPreviewResolution;
        }
    }

    private static boolean autoFocusAble(Camera camera) {
        return findSettableValue(camera.getParameters().getSupportedFocusModes(), "auto") != null;
    }

    public Point getCameraResolution() {
        return this.mCameraResolution;
    }

    public void setDesiredCameraParameters(Camera camera) {
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewSize(this.mPreviewResolution.x, this.mPreviewResolution.y);
        int[] selectPreviewFpsRange = selectPreviewFpsRange(camera, 60.0f);
        if (selectPreviewFpsRange != null) {
            parameters.setPreviewFpsRange(selectPreviewFpsRange[0], selectPreviewFpsRange[1]);
        }
        camera.setDisplayOrientation(getDisplayOrientation());
        camera.setParameters(parameters);
    }

    private int[] selectPreviewFpsRange(Camera camera, float f) {
        int i = (int) (f * 1000.0f);
        int[] iArr = null;
        int i2 = Integer.MAX_VALUE;
        for (int[] iArr2 : camera.getParameters().getSupportedPreviewFpsRange()) {
            int abs = Math.abs(i - iArr2[0]) + Math.abs(i - iArr2[1]);
            if (abs < i2) {
                iArr = iArr2;
                i2 = abs;
            }
        }
        return iArr;
    }

    public void openFlashlight(Camera camera) {
        doSetTorch(camera, true);
    }

    public void closeFlashlight(Camera camera) {
        doSetTorch(camera, false);
    }

    private void doSetTorch(Camera camera, boolean z) {
        String findSettableValue;
        Camera.Parameters parameters = camera.getParameters();
        if (z) {
            findSettableValue = findSettableValue(parameters.getSupportedFlashModes(), "torch", "on");
        } else {
            findSettableValue = findSettableValue(parameters.getSupportedFlashModes(), "off");
        }
        if (findSettableValue != null) {
            parameters.setFlashMode(findSettableValue);
        }
        camera.setParameters(parameters);
    }

    private static String findSettableValue(Collection<String> collection, String... strArr) {
        if (collection != null) {
            for (String str : strArr) {
                if (collection.contains(str)) {
                    return str;
                }
            }
        }
        return null;
    }

    private int getDisplayOrientation() {
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        int i = 0;
        Camera.getCameraInfo(0, cameraInfo);
        WindowManager windowManager = (WindowManager) this.mContext.getSystemService("window");
        if (windowManager == null) {
            return 0;
        }
        int rotation = windowManager.getDefaultDisplay().getRotation();
        if (rotation != 0) {
            if (rotation == 1) {
                i = 90;
            } else if (rotation == 2) {
                i = 180;
            } else if (rotation == 3) {
                i = 270;
            }
        }
        if (cameraInfo.facing == 1) {
            return (360 - ((cameraInfo.orientation + i) % 360)) % 360;
        }
        return ((cameraInfo.orientation - i) + 360) % 360;
    }

    private static Point getPreviewResolution(Camera.Parameters parameters, Point point) {
        Point findBestPreviewSizeValue = findBestPreviewSizeValue(parameters.getSupportedPreviewSizes(), point);
        return findBestPreviewSizeValue == null ? new Point((point.x >> 3) << 3, (point.y >> 3) << 3) : findBestPreviewSizeValue;
    }

    private static Point findBestPreviewSizeValue(List<Camera.Size> list, Point point) {
        Iterator<Camera.Size> it = list.iterator();
        int i = 0;
        int i2 = Integer.MAX_VALUE;
        int i3 = 0;
        while (true) {
            if (!it.hasNext()) {
                break;
            }
            Camera.Size next = it.next();
            int i4 = next.width;
            int i5 = next.height;
            int abs = Math.abs(i4 - point.x) + Math.abs(i5 - point.y);
            if (abs == 0) {
                i3 = i5;
                i = i4;
                break;
            }
            if (abs < i2) {
                i3 = i5;
                i = i4;
                i2 = abs;
            }
        }
        if (i <= 0 || i3 <= 0) {
            return null;
        }
        return new Point(i, i3);
    }
}