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


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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值