QrCodeScan
该项目已经有了升级版本:
- ZBar 的编译项目新地址: https://github.com/SkillCollege/ZBarBuildProj
- ZBar 的示例项目新地址: https://github.com/SkillCollege/ZBarScanProj
- ZXing3.1.0 版本项目地址: https://github.com/SkillCollege/ZXingProject
如果使用 ZBar 解码并且使用 ZXing3.1.0 扫描,只需要修改 ZXingProj 中的 DecodeHandler 解码模块,将 ZXing 的解码换成 ZBar 即可
如:
private void decode(byte[] data, int width, int height) {
Size size = activity.getCameraManager().getPreviewSize();
// 这里需要将获取的 data 翻转一下,因为相机默认拿的的横屏的数据
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < size.height; y++) {
for (int x = 0; x < size.width; x++)
rotatedData[x * size.height + size.height - y - 1] = data[x + y * size.width];
}
// 宽高也要调整
int tmp = size.width;
size.width = size.height;
size.height = tmp;
Rect rect = activity.getCropRect();
ZBarDecoder zBarDecoder = new ZBarDecoder();
String result = zBarDecoder.decodeCrop(rotatedData, size.width, size.height, rect.left, rect.top, rect.width(), rect.height());
if (result != null) {
if (null != activity.getHandler()) {
Message msg = new Message();
msg.obj = result;
msg.what = R.id.decode_succeeded;
activity.getHandler().sendMessage(msg);
}
// Message message = Message.obtain(activity.getHandler(),
// R.id.decode_succeeded, result);
// if (null != message) {
// message.sendToTarget();
// }
} else {
// Message message = Message.obtain(activity.getHandler(),
// R.id.decode_failed);
// if (null != message) {
// message.sendToTarget();
// }
if (null != activity.getHandler()) {
activity.getHandler().sendEmptyMessage(R.id.decode_failed);
}
}
}
QrCodeScan
这是 Android 手机客户端关于二维码扫描的源码,使用了高效的 ZBar 解码库,并修复了中文乱码。
融合了 ZXing 代码(使用其中的相机管理功能)。
一、 使用开源 ZXing 扫描的缺点
1、原始代码是横屏模式,尽管可以改成竖屏,但是扫描界面的自定义和多屏幕适配不好做
2、有效扫描区域不好控制,可能是我自己技术不成熟,没找到好方法
3、ZXing 是 Java 写的,对二维码的解析效率没有 ZBar 快
二、 使用 iOS 开发经常使用的 ZBar 扫描的缺点
1、 ZBar 是 C 实现的二维码解析,但是在解析中文时会乱码
2、 ZBar 的扫描界面对相机的控制没有 ZXing 封装的好
基于以上一些原因,笔者决定何不将二者结合起来,用 ZXing 来控制摄像头取得图像,用 ZBar 来解析扫描到的数据,最终形成目前的项目。
三、 开发步骤
首先剥离 ZXing 的 Camera 控制代码,得到扫描的原始数据,ZXing 的 ViewFindView 个人感觉不是很好,索性我就把它去掉了,
直接通过 xml 文件进行布局,多屏幕的适配瞬间就解决了。并且对于扫描激光线的动画效果,横竖屏的控制都只需要稍稍变换代码即可实现。 对于 ZBar 的中文乱码应该怎么解决呢?网上找了之后发现需要修改 ZBar 的 qrcodetxt.c 将里面的编码 ISO-8859-1 改成 GBK 就可以了
四、 使用方法
1、 Eclipse 直接导入运行即可
2、 如果是在 Android Studio 运行,出现
Couldn't load libzbar from loader dalvik.system.PathClassLoader findLibrary returned null
异常的解决方法是:
A. 把 so 文件放到如下目录(src/main/jniLibs/armeabi/libzbar.so)
|src
|--main/
|----java/
|----res/
|----jniLibs/
|------armeabi
|--------libzbar.so
B.Rebuild Project
注意:如果是想要在自己的项目中直接使用项目提供的 ZbarManager 源码。需要保持包名一致(com.zbar.lib)
感谢@Houny 提供的 Android Studio 下运行异常解决方法。
