最近做一个项目,在初始化相机时需要设置预览分辨率 ,我们采取和手机分辨率相近的比例,例如4:3,或者16:9.的手机,预览分辨率的话选择接近这一比例的一组数据,代码如下:
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> list = parameters.getSupportedPreviewSizes();
Camera.Size size;
int length = list.size();
int previewWidth = 480;
int previewheight = 640;
int second_previewWidth = 0;
int second_previewheight = 0;
if (length == 1)
{
size = list.get(0);
previewWidth = size.width;
previewheight = size.height;
}
else
{
for (int i = 0; i < length; i++)
{
size = list.get(i);
// System.out.println("宽 "+size.width+" 高"+size.height);
if ((width<height&&height*3==width*4)||(width>height&&width*3==height*4))
{
if (size.height <= 960 || size.width <= 1280)
{
second_previewWidth = size.width;
second_previewheight = size.height;
if (previewWidth <= second_previewWidth
&& second_previewWidth * 3 == second_previewheight * 4)
{
previewWidth = second_previewWidth;
previewheight = second_previewheight;
}
}
}
else
{
if((width<height&&height*9==width*16)||(width>height&&width*9==height*16)){
if ((size.height <= 960 || size.width <= 1280)&&size.width*9==size.height*16) {
second_previewWidth = size.width;
second_previewheight = size.height;
if (previewWidth <=second_previewWidth) {
previewWidth = second_previewWidth;
previewheight = second_previewheight;
}
}
}
else{
if (size.height <= 960 || size.width <= 1280)
{
second_previewWidth = size.width;
second_previewheight = size.height;
if (previewWidth <= second_previewWidth)
{
previewWidth = second_previewWidth;
previewheight = second_previewheight;
}
}
}
}
}
}
preWidth = previewWidth;
preHeight = previewheight;
System.out.println("预览分辨率:" + preWidth + " " + preHeight);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(preWidth, preHeight);
但是在华为手机上,由于虚拟导航栏的原因,会使得手机宽高出现偏差,如1920*1080的机器在竖屏时获取的宽小于1080,这样的话相机中的图片会出现轻微的变形,曾经想过利用沉浸模式去掉虚拟导航栏,结果导航栏不见了但是尺寸依旧不对,这里提供一个忽略虚拟导航栏,获取手机真实尺寸的方法:
@SuppressLint("NewApi") private void setScreenSize(Context context)
{
int x, y;
WindowManager wm = ((WindowManager)
context.getSystemService(Context.WINDOW_SERVICE));
Display display = wm.getDefaultDisplay();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
{
Point screenSize = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
display.getRealSize(screenSize);
x = screenSize.x;
y = screenSize.y;
} else
{
display.getSize(screenSize);
x = screenSize.x;
y = screenSize.y;
}
} else
{
x = display.getWidth();
y = display.getHeight();
}
width = x;
height = y;
}
经测试,此方法可行