Iterate over supported camera preview sizes to see which one best fits the dimensions of the given view while maintaining the aspect ratio. - Android android.hardware

Android examples for android.hardware:Camera Preview

Description

Iterate over supported camera preview sizes to see which one best fits the dimensions of the given view while maintaining the aspect ratio.

Demo Code

import java.util.List;

import android.hardware.Camera;
import android.util.Log;

public class Main {

  private static final String TAG = "Camera";

  /**/* w w w. j  av  a 2 s .  c o  m*/
   * Iterate over supported camera preview sizes to see which one best fits the
   * dimensions of the given view while maintaining the aspect ratio. If none can,
   * be lenient with the aspect ratio.
   *
   * @param sizes
   *          Supported camera preview sizes.
   * @param w
   *          The width of the view.
   * @param h
   *          The height of the view.
   * @return Best match camera preview size to fit in the view.
   */
  public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
    // Use a very small tolerance because we want an exact match.
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) w / h;
    if (sizes == null)
      return null;

    Camera.Size optimalSize = null;

    // Start with max value and refine as we iterate over available preview sizes.
    // This is the
    // minimum difference between view and camera height.
    double minDiff = Double.MAX_VALUE;

    // Target view height
    int targetHeight = h;

    // Try to find a preview size that matches aspect ratio and the target view
    // size.
    // Iterate over all available sizes and pick the largest size that can fit in
    // the view and
    // still maintain the aspect ratio.
    for (Camera.Size size : sizes) {
      Log.d(TAG, "SupportedSize(W, H) -> " + "(" + size.width + "," + size.height + ")");
      double ratio = (double) size.width / size.height;
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
        continue;
      if (Math.abs(size.height - targetHeight) < minDiff) {
        optimalSize = size;
        minDiff = Math.abs(size.height - targetHeight);
      }
    }

    // Cannot find preview size that matches the aspect ratio, ignore the
    // requirement
    if (optimalSize == null) {
      minDiff = Double.MAX_VALUE;
      for (Camera.Size size : sizes) {
        if (Math.abs(size.height - targetHeight) < minDiff) {
          optimalSize = size;
          minDiff = Math.abs(size.height - targetHeight);
        }
      }
    }
    return optimalSize;
  }

}

Related Tutorials