研究使用了ZXing来实现扫描二维码的功能,根据demo写的移植过来,扫描速度还行,因为zxing自带的声音不好听,然后又剽窃了微信的beep声音,基本差不多的时候,发现扫描二维码预览的时候,中间的预览图片和二维码有轻微变形。于是就从网上搜索并研究了一下,终于解决了,在此简单分享一下:
http://blog.youkuaiyun.com/xiaanming/article/details/10163203
[这是我参考的大神的博客,讲的很详细,也有demo可以下载]
然后,因为我嫌中间扫描的预览区域不是正方形,我就自己修改成正方形了,修改方法:
package com.mining.app.zxing.camera;
/**
* This object wraps the Camera service object and expects to be the only one
* talking to it. The implementation encapsulates the steps needed to take
* preview-sized images, which are used for both preview and decoding.
* 此对象包装相机服务对象,并希望是唯一一个与它交互的对象。 封装了实现需要预览步骤大小的图像,用于预览和解码。
*
*/
public final class CameraManager {
private static final String TAG = CameraManager.class.getSimpleName();
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 = 480;//修改使宽高相等即可
private static CameraManager cameraManager;
然后,就是预览变形的问题了,首先,你应该知道一件很重要的事,就是为什么预览的照片会变形.
http://www.360doc.com/content/14/0825/15/16319846_404515413.shtml
每部手机中设置了好几组预览图片的尺寸、以及实际图片的尺寸。只有当预览图的尺寸比例和实际图片的比例相同的时候才不会出现变形的情况。
对于ZXing扫描来说,实际图片的大小就是屏幕的大小,所以我们要从好几组预览图片的尺寸中找到一组最合适的,这样预览的图片就不会变形了。这就需要我们修改CameraConfigurationManager类中findBestPreviewSizeValue方法:
com.mining.app.zxing.camera.CameraConfigurationManager.java
private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) {
int bestX = 0;
int bestY = 0;
float diff = Float.MAX_VALUE;//此处修改类型
Log.d(TAG, "screen point: "+screenResolution);
for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {
previewSize = previewSize.trim();
int dimPosition = previewSize.indexOf('x');
if (dimPosition < 0) {
Log.w(TAG, "Bad preview-size: " + previewSize);
continue;
}
int newX;
int newY;
try {
newX = Integer.parseInt(previewSize.substring(0, dimPosition));
newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
} catch (NumberFormatException nfe) {
Log.w(TAG, "Bad preview-size: " + previewSize);
continue;
}
//caculate best solusion
//int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
//获取x,y比例最相近的一个,此处重写方案
float newDiff = Math.abs(screenResolution.x * 1.0f / newY - screenResolution.y * 1.0f / newX);
if (newDiff == 0) {
bestX = newX;
bestY = newY;
break;
} else if (newDiff < diff) {
bestX = newX;
bestY = newY;
diff = newDiff;
}
Log.w(TAG, "preview-size: " + previewSize +", newDiff: "+newDiff+", diff: "+diff);
}
if (bestX > 0 && bestY > 0) {
return new Point(bestX, bestY);
}
return null;
}
这样就基本解决了预览变形的问题。剩下的就是优化了,现在如果手机离得太近,识别还是很慢,微信就优化的可好,继续研究.