项目地址: http://blog.csdn.net/xiaanming/article/details/10163203
1. 关于照相机拉伸拉长的问题解决:
Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
这篇文章写的不错,但是按照这篇文章使用二维码的话会出现竖屏扫描图像拉伸变长的问题(有一个地方计算错误),解决拉伸变长的问题后又会出现闪退的问题(传输大Bitmap对象导致闪退,改为Byte数组或者不传递Bitmap)
其他地方不动,即可完美移植二维码扫描功能
改动一:
CameraConfigurationManager文件findBestPreviewSizeValue方法下边这句
int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
改为int newDiff=Math.abs(newY - screenResolution.x) + Math.abs(newX - screenResolution.y);原文那样计算是因为计算的是横屏扫描的分辨率
这样改动后发现扫描不拉伸了,但是没有扫描结果,扫描结果返回的界面一闪而退,是因为Activity之间传递了大的Bitmap
改动二:
MipcaActivityCapture文件handleDecode方法中将Bitmap转为Byte数组然后再在Activity之间传递或者不传递Bitmap
Intent resultIntent = new Intent(); Bundle bundle = new Bundle(); bundle.putString("result", resultString); // bundle.putParcelable("bitmap", barcode); // ByteArrayOutputStream baos=new ByteArrayOutputStream(); // barcode.compress(Bitmap.CompressFormat.PNG, 100, baos); // byte [] bitmapByte =baos.toByteArray(); // bundle.putByteArray("bitmap",bitmapByte); resultIntent.putExtras(bundle); this.setResult(RESULT_OK, resultIntent);经过这两处改动,就可以完美使用二维码了原文还有个问题就是扫描二维码的区域有点小,需要离被扫描的二维码很远才能被扫描2.关于相框取景小的问题的改动在com.zxing.camera包中找到
//修改这里最小最大值,限制扫描框大小
private static final int MIN_FRAME_WIDTH = 240;//240
private static final int MIN_FRAME_HEIGHT = 240;//240
private static final int MAX_FRAME_WIDTH = 480;//480
private static final int MAX_FRAME_HEIGHT = 480;//360
CameraManager类的getFramingRect方法
public Rect getFramingRect() {
Point screenResolution = configManager.getScreenResolution();
if (framingRect == null) {
if (camera == null) {
return null;
}
int width = screenResolution.x * 2 / 3;//设定框框宽度大小
if (width < MIN_FRAME_WIDTH) {
width = MIN_FRAME_WIDTH;
} else if (width > MAX_FRAME_WIDTH) {
width = MAX_FRAME_WIDTH;
}
int height = screenResolution.y * 2/ 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) / 5;//设定框框离顶部相对位置
framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
Log.d(TAG, "Calculated framing rect: " + framingRect);
}
return framingRect;
}