现在的位置: 首页 > 综合 > 正文

利用反射获取Camera支持尺寸大小

2018年04月19日 ⁄ 综合 ⁄ 共 2876字 ⁄ 字号 评论关闭
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);

抱歉!评论已关闭.