您的位置:首页 > 其它

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

2014-12-30 11:17 489 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: