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