一个用于在 Android 上解码 QR 码和条形码的新框架。它更快、更简单、更准确。
一个Android平台更快更简单更精准的条形码及二维码解析框架。采用ZBar解析图像数据,兼容Android4.0 (API14)及以上版本。
| Demo下载 | 示例效果 |
|---|---|
| 点此下载 或扫描下面二维码 | |
本项目基于ZBar进行开发,分别对视图、相机、解码三个方面进行了封装,同时降低三者之间的耦合,增加可灵活配置性。
视图
AdjustTextureView,继承自TextureView,开放setImageFrameMatrix接口,可根据自身尺寸、图像帧宽高及旋转角度对图像进行校正,解决预览画面变形等异常问题。ScannerFrameView,继承自View,可通过xml属性或接口自定义扫描框、四个角及扫描线的尺寸、颜色、动画等,具体属性使用参考源码注解。MaskRelativeLayout&MaskConstraintLayout,分别继承自RelativeLayout&ConstraintLayout,用于绘制扫描框外部阴影。相机
android.hardware.camera2及android.hardware.Camera两版API。TextureReader代替ImageReader,采用openGL绘制图像纹理,主要解决ImageReader实时输出YUV格式图像时预览掉帧严重的问题。解码
在module的build.gradle中添加如下代码
dependencies {
implementation 'cn.simonlee.xcodescanner:zbar:1.1.10'
}STEP.1
在Activity的onCreate方法中获取CameraScanner实例,并对CameraScanner和TextureView设置监听
…STEP.2
在onSurfaceTextureAvailable回调中设置SurfaceTexture及TextureView的宽高,然后开启相机
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mCameraScanner.setPreviewTexture(surface);
mCameraScanner.setPreviewSize(width, height);
mCameraScanner.openCamera(this);
}STEP.3
在openCameraSuccess回调中设置图像帧的宽高及旋转角度,获取ZBarDecoder实例设置给CameraScanner
…STEP.4
在ZBarDecoder的decodeSuccess回调中获取解析结果,开发者可根据回传的条码类型及精度自定义脏数据过滤规则
public void decodeSuccess(int type, int quality, String result) {
ToastHelper.showToast("[类型" + type + "/精度" + quality + "]" + result, ToastHelper.LENGTH_SHORT);
}STEP.5
在Activity的onDestroy方法中关闭相机和解码
public void onDestroy() {
mCameraScanner.setGraphicDecoder(null);
mCameraScanner.detach();
if (mGraphicDecoder != null) {
mGraphicDecoder.setDecodeListener(null);
mGraphicDecoder.detach();
}
super.onDestroy();
}Tips.1
在Activity的onPause方法中关闭相机
public void onPause() {
mCameraScanner.closeCamera();
super.onPause();
}Tips.2
在Activity的onRestart方法中开启相机
public void onRestart() {
//部分机型在后台转前台时会回调onSurfaceTextureAvailable开启相机,因此要做判断防止重复开启
if (mTextureView.isAvailable()) {
mCameraScanner.setPreviewTexture(mTextureView.getSurfaceTexture());
mCameraScanner.setPreviewSize(mTextureView.getWidth(), mTextureView.getHeight());
mCameraScanner.openCamera(this.getApplicationContext());
}
super.onRestart();
}Tips.3
设置扫码框识别区域时,要考虑到扫码框的margin和padding属性。
V1.1.10 2018/09/21
OldCameraScanner中判断闪光灯状态时可能引起的空指针异常。cn.simonlee.xcodescanner:zbar:1.1.10。V1.1.9 2018/09/19
NewCameraScanner关闭相机时提前释放SurfaceTexture的问题。cn.simonlee.xcodescanner:zbar:1.1.9。V1.1.8 2018/09/10
ZBarDecoder中在子线程实例化ImageScanner对象,避免在主线程中进行System.loadLibrary()。NewCameraScanner中关闭相机时未释放Surface对象的问题。cn.simonlee.xcodescanner:zbar:1.1.8。V1.1.7 2018/08/07
OldCameraScanner和NewCameraScanner取消单例模式,增加单例信号量CameraLock解决可能产生的相机并发操作。GraphicDecoder新增setCodeTypes(int[] codeType)接口指定识别的类型。MaskConstraintLayout及MaskRelativeLayout新增frame_viewid属性,用于指定绘制阴影的View(便于开发者使用自定义的扫描框)。ZBarDecoder构造方法调整。CameraScanner中的setSurfaceTexture(SurfaceTexture surfaceTexture)接口更名为setPreviewTexture(SurfaceTexture surfaceTexture)。CameraScanner新增enableBrightnessFeedback(boolean enable)接口,设置是否开启亮度回馈。CameraListener新增cameraBrightnessChanged(int brightness)接口,对亮度变化进行回馈。BaseHandler。cn.simonlee.xcodescanner:zbar:1.1.7。V1.1.6 2018/05/08
GraphicDecoder增加本地图片识别接口。GraphicDecoder.DecodeListener中的decodeSuccess接口,改为decodeComplete。CameraScanner新增闪光灯控制接口。AdjustTextureView尺寸变化导致图像显示异常的问题。cn.simonlee.xcodescanner:zbar:1.1.6。V1.1.5 2018/05/01
ZBarDecoder和TextureReader的实现方式,降低CPU占用。DebugZBarDecoder,继承自ZBarDecoder,便于示例程序进行兼容性测试。CameraScanner迁移到GraphicDecoder,CameraScanner可能因为异步导致暂停后继续回调decodeSuccess接口。cn.simonlee.xcodescanner:zbar:1.1.5。V1.1.4 2018/04/26
OldCameraScanner默认没有开启解码的问题。cn.simonlee.xcodescanner:zbar:1.1.4。V1.1.3 2018/04/25
CameraScanner新增stopDecode()和startDecode(int delay)接口,可暂停/延时解码。com.simonlee.xcodescanner变更为cn.simonlee.xcodescanner。cn.simonlee.xcodescanner:zbar:1.1.3,codescanner变更为xcodescanner,由此带来不便的敬请谅解。V1.1.2 2018/04/24
ZBarDecoder中设置解码类型无效的问题。V1.1.1 2018/04/16
ScannerFrameView增加高占比属性,可设置相对父容器高的占比。cn.simonlee.codescanner:zbar:1.1.1。V1.1.0 2018/04/16
ZBarDecoder,解决单线程池可能引起的条码解析延迟问题。OldCameraScanner扫描框区域识别异常的问题。V1.0.9 2018/04/14
NewCameraScanner扫描框区域识别异常的问题。NewCameraScanner出现异常的问题。V1.0.8 2018/04/13
AutoFixTextureView更名为AdjustTextureView,重写图像校正方式。Camera2Scanner更名为NewCameraScanner。OldCameraScanner实现对Android5.0以下的支持。NewCameraScanner中取消ImageReader的支持。V1.0.7 2018/04/10
MaskConstraintLayout布局。Camera2Scanner,解决后台切换导致的闪退问题。V1.0.6 2018/04/09
V1.0.5 2018/03/29
V1.0.4 2018/03/27
ZBarDecoder,修复多线程可能的空指针异常。GraphicDecoder,EGL14替换EGL10,解决部分机型不兼容的问题;解决多线程可能的空指针异常。V1.0.3 2018/03/23
TextureReader,通过双缓冲纹理获取帧数据进行回调,代替ImageReader的使用。GraphicDecoder,handler放到子类中去操作。V1.0.2 2018/03/14
GraphicDecoder,将条码解析模块进行抽离。ZBarDecoder,采用ZBar解析条码,并增加解析类型及解析精度设置。ScannerFrameView,扫描线动画由属性动画实现。Camera2Scanner,修复释放相机可能导致的异常,增加扫描框区域设置。V1.0.1 2018/02/09
ScannerFrameLayout,为RelativeLayout的子类,可对扫描框的位置和大小进行设置。ScannerFrameView,可对扫描框内部进行定制。V1.0.0 2018/02/03
初次提交代码。
这是我个人的第一个开源项目,在开源的过程中碰到了许多疑点难点,多处借鉴很多大神的成果。因为自己的疏忽没有预先做好参考记录,在这里向那些为开源默默奉献的大神们致敬!Thanks!
如果在使用过程中遇到了闪退、黑屏、无法识别、无法对焦、预览掉帧、内存泄漏等任何异常问题,欢迎提Issues!同时请尽量附上设备型号、android版本号、BUG复现步骤、异常日志、无法识别的图像等,我会尽快安排解决。(若回复不及时可直接微信)
如果您觉得有用,请动动小手给我一个Star来点鼓励:blush:
| Author | 博客 | ||
|---|---|---|---|
| Simon Lee | [email protected] | 简书 · 掘金 |
暂无开放 Issues,或尚未同步最近议题。