Back to project page android-util.
The source code is released under:
Apache License
If you think the Android project android-util listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.ms.square.android.util; /* w w w . j a va 2 s . c om*/ import android.annotation.TargetApi; import android.app.Activity; import android.hardware.Camera; import android.os.Build; import android.util.Log; import android.view.Surface; import java.util.List; public class CameraUtil { private static final String TAG = CameraUtil.class.getSimpleName(); /** * 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; } /** * Iterate over supported video record sizes to pick the largest one which satisfies * maxAllowedWidth and maxAllowedHeight. * * @param sizes- Supported video record sizes. * @param maxAllowedWidth * @param maxAllowedHeight * @return Largest Video Record size with its dimension satisfying the specified max width and height */ public static Camera.Size getOptimalVideoSize(List<Camera.Size> sizes, int maxAllowedWidth, int maxAllowedHeight) { if (sizes == null) return null; Camera.Size optimalSize = null; int calcWidth = 0; int calcHeight = 0; for (Camera.Size size : sizes) { Log.d(TAG, "SupportedSize(W, H) -> " + "(" + size.width + "," + size.height + ")"); int width = size.width; int height = size.height; if (width <= maxAllowedWidth && height <= maxAllowedHeight) { if (width >= calcWidth && height >= calcHeight) { calcWidth = size.width; calcHeight = size.height; optimalSize = size; } } } return optimalSize; } /** * @return the default camera on the device. Return null if there is no camera on the device. */ public static Camera getDefaultCameraInstance() { return Camera.open(); } /** * @return the default rear/back facing camera on the device. Returns null if camera is not * available. */ public static Camera getDefaultBackFacingCameraInstance() { return getDefaultCamera(Camera.CameraInfo.CAMERA_FACING_BACK); } /** * @return the default front facing camera on the device. Returns null if camera is not * available. */ public static Camera getDefaultFrontFacingCameraInstance() { return getDefaultCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); } /** * * @param position Physical position of the camera i.e Camera.CameraInfo.CAMERA_FACING_FRONT * or Camera.CameraInfo.CAMERA_FACING_BACK. * @return the default camera on the device. Returns null if camera is not available. */ @TargetApi(Build.VERSION_CODES.GINGERBREAD) private static Camera getDefaultCamera(int position) { // Find the total number of cameras available int mNumberOfCameras = Camera.getNumberOfCameras(); // Find the ID of the back-facing ("default") camera Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); for (int i = 0; i < mNumberOfCameras; i++) { Camera.getCameraInfo(i, cameraInfo); if (cameraInfo.facing == position) { return Camera.open(i); } } return null; } /** * Assumes the starting position is 0 (landscape, clockwise). * @param activity * @param cameraId * @return the camera's display orientation */ public static int getCameraDisplayOrientation(Activity activity, int cameraId) { Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } return result; } }