用到系统相机,但是会出现图片被拉伸了怎么办呢?不要慌,下面就给出解决方法。
//初始化并打开相机
private void initAndStartCamera() {
//判断是否有相机
if (MyCameraUtils.checkCameraHardware(context)) {
try {
stopAndReleaseCamera();
//打开照相机,默认打开后置相机
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
//填充相机预览界面
mCamera.setPreviewDisplay(sfvCameraPerview.getHolder());
//设置相机预览方向
mCamera.setDisplayOrientation(90);
//给照相机设置参数
Camera.Parameters parameters = mCamera.getParameters();
Display display = getWindowManager().getDefaultDisplay();
int height = display.getWidth();
int width = display.getHeight();
Camera.Size size = getBestPreviewSize(width, height);
try {
parameters.setPictureSize(size.width, size.height);
parameters.setPreviewSize(size.width, size.height);
mCamera.setParameters(parameters);
} catch (Exception e) {
try {
parameters.setPictureSize(size.width, size.height);
mCamera.setParameters(parameters);
} catch (Exception e1) {
}
}
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (focus) {
mPreviewData = data;
}
}
});
//开启预览
mCamera.startPreview();
} catch (Exception e) {
}
} else {
LogUtils.d(TAG, "手机没有相机功能");
}
}
//获取手机分辨率最佳显示大小
private Camera.Size getBestPreviewSize(int width, int height) { Camera.Size result = null; final Camera.Parameters p = mCamera.getParameters(); //特别注意此处需要规定rate的比是大的比小的,不然有可能出现rate = height/width,但是后面遍历的时候,current_rate = width/height,所以我们限定都为大的比小的。 float rate = (float) Math.max(width, height) / (float) Math.min(width, height); float tmp_diff; float min_diff = -1f; for (Camera.Size size : p.getSupportedPreviewSizes()) { float current_rate = (float) Math.max(size.width, size.height) / (float) Math.min(size.width, size.height); tmp_diff = Math.abs(current_rate - rate); if (min_diff < 0) { min_diff = tmp_diff; result = size; } if (tmp_diff < min_diff) { min_diff = tmp_diff; result = size; } } return result; } //重置相机 private void stopAndReleaseCamera() { if (mCamera != null) { mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } }