1.设置预览分辨路和图片分辨率:
Camera.Parameters param = camera.getParameters();
param.setPreviewSize(width, height); //width一般大于height setParameters failed问题解决:
param.setPictureSize(width, height);//width一般大于height setParameters failed问题解决:
camera.setPerviewSize(screenWidth,screenHeight);// 不要这样设置,不然不会设置成功的;
camera.setPerviewSize(screenHeight , screenWidth );//应该这样设置,第一个参数大于后面那个参数
params.set("orientation", "landscape");//这样设置也可以
camera.setDisplayOrientation(90);//相机旋转90度,便成竖屏
camera.setParameters(param);//这句话不要忘记
2. setParameters failed问题解决:
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1834)
3.width一般大于height,因为默认的摄像头是横向的,在我们预览的时候也要设置
camera.setDisplayOrientation(90);
4.预览变形解决:
一般手机屏幕分辨率为16:9,而可能默认的预览分辨率是4:3的,
然而我们在设置布局文件的时候设置的预览界面SurfaceView宽高均为match_parent,让预览界面充满屏幕,
所以自然就会出现预览变形的情况。
WindowManager windowManager = mcontext.getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
//获取屏幕的宽和高
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
计算预览分辨率的宽高比:
public String getSurfaceViewSize(int width, int height) {
if (equalRate(width, height, 1.33f)) {
return "4:3";
} else {
return "16:9";
}
}
public boolean equalRate(int width, int height, float rate) {
float r = (float)width /(float) height;
if (Math.abs(r - rate) <= 0.2) {
return true;
} else {
return false;
}
}
根据分辨率设置SurfaceView的大小:
/**
* 根据分辨率设置预览SurfaceView的大小以防止变形
*
* @param surfaceSize
*/
private void setSurfaceViewSize(String surfaceSize) {
ViewGroup.LayoutParams params = surfaceView.getLayoutParams();
if (surfaceSize.equals("16:9")) {
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
} else if (surfaceSize.equals("4:3")) {
params.height = 4 * screenWidth / 3;
}
surfaceView.setLayoutParams(params);
这样基本就不会变形了,还有些手机可能既不是16:9也不是4:3 的屏幕分辨率,都可以通过计算比例适当缩放使其不变形。