(一)Zxing二维码扫描框大小调整
控制扫描框大小代码是在CameraManager类中
google在CameraManager类中设置扫描框大小主要在getFramingRect()中:
private static final int MIN_FRAME_WIDTH = 240;
private static final int MIN_FRAME_HEIGHT = 240;
private static final int MAX_FRAME_WIDTH = 480;
private static final int MAX_FRAME_HEIGHT = 360;
public Rect getFramingRect() {
Point screenResolution = configManager.getScreenResolution();
if (framingRect == null) {
if (camera == null) {
return null;
}
int width = screenResolution.x * 3 / 4;
if (width < MIN_FRAME_WIDTH) {
width = MIN_FRAME_WIDTH;
} else if (width > MAX_FRAME_WIDTH) {
width = MAX_FRAME_WIDTH;
}
int height = screenResolution.y * 3 / 4;
if (height < MIN_FRAME_HEIGHT) {
height = MIN_FRAME_HEIGHT;
} else if (height > MAX_FRAME_HEIGHT) {
height = MAX_FRAME_HEIGHT;
}
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
Log.d(TAG, "Calculated framing rect: " + framingRect);
}
return framingRect;
}
public Rect getFramingRect() {
Point screenResolution = configManager.getScreenResolution();
if (framingRect == null) {
if (camera == null) {
return null;
}
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = (int)(metrics.widthPixels * 0.6);
int height = (int)(width * 0.9);
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
Log.d(TAG, "Calculated framing rect: " + framingRect);
}
return framingRect;
}
以上方式可以实现扫描框扩大,但是部分机型会出现,扫描后闪退现象,原因是在 MipcaActivityCapture的handleDecode中向bundle中添加的bitmap过大,代码是bundle.putParcelable("bitmap", barcode); handleDecode是用来处理扫描结果的,例如向调用MipcaActivityCapture的Activity回传扫描结果和扫描得到的bitmap。但bitmap不能过大超出内存限制就会奔溃。
解决的办法:如果不需要显示扫描得到的图片,我们可以不将bitmap导入bundle,直接将bundle.putParcelable("bitmap", barcode)注释掉。
如果一定要获得bitmap,则需要在导入前将bitmap压缩
(二)Zxing是google提供的二维码扫描工程
扫描框默认是横屏的转换成竖屏后图片会出现拉伸现象
解决的办法:
Zxing 修改 CameraConfigurationManager.Java文件的
void initFromCameraParameters(Camera camera)方法,在 Log.d(TAG, "Screen resolution: " + screenResolution);这句之后增加
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
// preview size is always something like 480*320, other 320*480
if (screenResolution.x < screenResolution.y) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
}
同时把之后的代码如
cameraResolution = getCameraResolution(parameters, screenResolution);
修改为
cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
经过如上操作后基本可以解决,图片拉伸的问题,但是部分机型会出现,扫描后闪退现象,原因和扩大扫描框后出现闪退的原因类似,基本是bitmap过大的原因。