1. 程式人生 > >android Zxing掃碼二維碼拉伸解決

android Zxing掃碼二維碼拉伸解決

Zxing掃描二維碼:

2、可能是原始碼庫不同,我這邊在 CameraConfigurationUtils 裡面的  findBestPreviewSizeValue 修改尺寸

3、修改的位置和程式碼:

public static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution) {

  List<Camera.Size> rawSupportedSizes = parameters.getSupportedPreviewSizes();
  if (rawSupportedSizes == null) {
    Log.w(TAG, "Device returned no supported preview sizes; using default");
    Camera.Size defaultSize = parameters.getPreviewSize();
    if (defaultSize == null) {
      throw new IllegalStateException("Parameters contained no preview size!");
    }
    return new Point(defaultSize.width, defaultSize.height);
  }

  // Sort by size, descending
  List<Camera.Size> supportedPreviewSizes = new ArrayList<>(rawSupportedSizes);
  Collections.sort(supportedPreviewSizes, new Comparator<Camera.Size>() {
    @Override
    public int compare(Camera.Size a, Camera.Size b) {
      int aPixels = a.height * a.width;
      int bPixels = b.height * b.width;
      if (bPixels < aPixels) {
        return -1;
      }
      if (bPixels > aPixels) {
        return 1;
      }
      return 0;
    }
  });

  if (Log.isLoggable(TAG, Log.INFO)) {
    StringBuilder previewSizesString = new StringBuilder();
    for (Camera.Size supportedPreviewSize : supportedPreviewSizes) {
      previewSizesString.append(supportedPreviewSize.width).append('x')
          .append(supportedPreviewSize.height).append(' ');
    }
    Log.i(TAG, "Supported preview sizes: " + previewSizesString);
  }

  double screenAspectRatio = screenResolution.x / (double) screenResolution.y;

  // Remove sizes that are unsuitable
  Iterator<Camera.Size> it = supportedPreviewSizes.iterator();
  while (it.hasNext()) {
    Camera.Size supportedPreviewSize = it.next();
    int realWidth = supportedPreviewSize.width;
    int realHeight = supportedPreviewSize.height;
    if (realWidth * realHeight < MIN_PREVIEW_PIXELS) {
      it.remove();
      continue;
    }

    boolean isCandidatePortrait = realWidth < realHeight;
    int maybeFlippedWidth = isCandidatePortrait ? realHeight : realWidth;
    int maybeFlippedHeight = isCandidatePortrait ? realWidth : realHeight;
    double aspectRatio = maybeFlippedWidth / (double) maybeFlippedHeight;
    double distortion = Math.abs(aspectRatio - screenAspectRatio);
    if (distortion > MAX_ASPECT_DISTORTION) {
      it.remove();
      continue;
    }

    if (maybeFlippedWidth == screenResolution.x && maybeFlippedHeight == screenResolution.y) {
      Point exactPoint = new Point(realWidth, realHeight);
      Log.i(TAG, "Found preview size exactly matching screen size: " + exactPoint);
      return exactPoint;
    }
  }

  // If no exact match, use largest preview size. This was not a great idea on older devices because
  // of the additional computation needed. We're likely to get here on newer Android 4+ devices, where
  // the CPU is much more powerful.
  if (!supportedPreviewSizes.isEmpty()) {
    Camera.Size largestPreview = supportedPreviewSizes.get(0);
    Point largestSize = new Point(largestPreview.width, largestPreview.height);
    Log.i(TAG, "Using largest suitable preview size: " + largestSize);
    return largestSize;
  }

  // If there is nothing at all suitable, return current preview size
  Camera.Size defaultPreview = parameters.getPreviewSize();
  if (defaultPreview == null) {
    throw new IllegalStateException("Parameters contained no preview size!");
  }
  //修改的位置在這裡,新增如下程式碼,替換defaultPreview return
  Point screenResolutionForCamera = new Point();
  screenResolutionForCamera.x = screenResolution.x;
  screenResolutionForCamera.y = screenResolution.y;
  // preview size is always something like 480*320, other 320*480
  if (screenResolution.x < screenResolution.y) {
    screenResolutionForCamera.x = screenResolution.y;
    screenResolutionForCamera.y = screenResolution.x;
  }
  Point cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
  Log.i(TAG, "No suitable preview sizes, using default: " + cameraResolution );
  return cameraResolution ;
//Point defaultSize = new Point(defaultPreview.width, defaultPreview.height); //Log.i(TAG, "No suitable preview sizes, using default: " + defaultSize); //return defaultSize; }
private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) {

  String previewSizeValueString = parameters.get("preview-size-values");
  // saw this on Xperia
  if (previewSizeValueString == null) {
    previewSizeValueString = parameters.get("preview-size-value");
  }

  Point cameraResolution = null;

  if (previewSizeValueString != null) {
    Log.e(TAG, "preview-size-values parameter: " + previewSizeValueString);
    cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution);
  }

  if (cameraResolution == null) {
    // Ensure that the camera resolution is a multiple of 8, as the screen may not be.
    cameraResolution = new Point((screenResolution.x >> 3) << 3, (screenResolution.y >> 3) << 3);
  }

  return cameraResolution;
}