import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import android.hardware.Camera; import android.hardware.Camera.Size; public class SupportedSizesReflect { private static Method Parameters_getSupportedPreviewSizes = null; private static Method Parameters_getSupportedPictureSizes = null; static { initCompatibility(); }; private static void initCompatibility() { try { Parameters_getSupportedPreviewSizes = Camera.Parameters.class .getMethod("getSupportedPreviewSizes", new Class[] {}); Parameters_getSupportedPictureSizes = Camera.Parameters.class .getMethod("getSupportedPictureSizes", new Class[] {}); } catch (NoSuchMethodException nsme) { nsme.printStackTrace(); Parameters_getSupportedPreviewSizes = Parameters_getSupportedPictureSizes = null; } } /** * Android 2.1之后有效 * * @param p * @return Android1.x返回null */ public static List<Size> getSupportedPreviewSizes(Camera.Parameters p) { return getSupportedSizes(p, Parameters_getSupportedPreviewSizes); } public static List<Size> getSupportedPictureSizes(Camera.Parameters p) { return getSupportedSizes(p, Parameters_getSupportedPictureSizes); } @SuppressWarnings("unchecked") private static List<Size> getSupportedSizes(Camera.Parameters p, Method method) { try { if (method != null) { return (List<Size>) method.invoke(p); } else { return null; } } catch (InvocationTargetException ite) { Throwable cause = ite.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } else if (cause instanceof Error) { throw (Error) cause; } else { throw new RuntimeException(ite); } } catch (IllegalAccessException ie) { return null; } } } Camera.Parameters params = mCamera.getParameters(); List<Size> supportedPictureSizes = SupportedSizesReflect.getSupportedPictureSizes(params); List<Size> supportedPreviewSizes = SupportedSizesReflect.getSupportedPreviewSizes(params); if ( supportedPictureSizes != null && supportedPreviewSizes != null && supportedPictureSizes.size() > 0 && supportedPreviewSizes.size() > 0) { //2.x Size pictureSize = supportedPictureSizes.get(0); int maxSize = 1920; if(maxSize > 0){ for(Size size : supportedPictureSizes){ if(maxSize >= Math.max(size.width,size.height)){ pictureSize = size; break; } } } Size previewSize = getOptimalPreviewSize( supportedPreviewSizes, DisplayUtil.getDisplayWidth(), DisplayUtil.getDisplayHeight()); params.setPictureSize(pictureSize.width, pictureSize.height); params.setPreviewSize(pictureSize.width, pictureSize.height); Log.i(TAG, "pictureSize .width:" + pictureSize.width + "---height:" + pictureSize.height); Log.i(TAG, "previewSize .width:" + previewSize.width + "---height:" + previewSize.height); } mCamera.setParameters(params);