前言
Hndxing 是一个基于 ZXing 源码的基础上面,抽离其出 Android 端的扫码功能,而进一步封装而成的一个开源库 。相信有过封装 Zxing 官方源码的经历的话,都会遇到在竖屏的时候,无法在竖屏时正常扫一维码,扫一维码的时候,需要把手机横着扫码,这就会给用户造成非常不好的体验;而且在扫二维码的时候,需要把手机和需要扫的码保持一定的距离,才可以正常扫码,这也是会带给用户非常不好的体验的;造成这些的原因,除了跟移动的手机端的摄像机硬件模块的成像特点有一定的关系,也是和 Zxing 的相关源码有一定的关系。哈哈,当然,这一篇笔者就先不讨论造成上面的两者的原因,而是主要介绍笔者封装的扫码库的如何使用。
特性
- 提供在竖屏状态下设别一维码、二维码的功能;
- 优化在竖屏状态识别一维码、二维码的速度、距离;
效果
原生的 Hndroid 效果(因为虚拟机不具有摄像头,所以显示的是黑灰格)

由开发者自定义后的 Hndroid 效果

使用
添加对应权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
添加 Gradle:
把 JitPack 库加入到你的项目根目录下的 build.gradle 文件下
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
添加依赖到你的项目中
dependencies {
compile 'com.github.Hndroid:Hndxing:1.0.1'
}
or 添加 Maven:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
添加依赖到你的项目中
<dependency>
<groupId>com.github.Hndroid</groupId>
<artifactId>Hndxing</artifactId>
<version>1.0.1</version>
</dependency>
接下来添加两个布局控件到你的项目布局中:
<SurfaceView
android:id="@+id/preview_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<com.makerspace.hndroid.hxing.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
继承抽象类 BarCodeActivity 并重写其三个方法:
@Override
protected int provideContentView() {
//返回上面添加的两个控件所在的布局,代替
//onCreate()生命周期方法里面的 setContentView() 方法;
return R.layout.activity_caputrue_layout;
}
@Override
protected SurfaceView setSurfaceViewInstance() {
//返回 SurfaceView 的对象引用
return findViewById(R.id.preview_view);
}
@Override
protected ViewfinderView setViewfinderViewInstance() {
//返回 ViewfinderView 的对象引用
return findViewById(R.id.viewfinder_view);
}
最后,在已经继承了抽象类 BarCodeActivity 的生命周期函数 onCreate() 回调扫码结果方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注:setContentView() 这里不需要该方法了;
this.setOnBarCodeResultListener(new OnResultListener() {
@Override
public void onResult(String resultContext, String barcodeFormatName) {
//resultContext 表示已扫码的内容
//barcodeFormatName 表示已扫码的种类
}
});
}
以上是调用 Hndroid 库的一般步骤;
说明
为了使得 Android 开发者可以更加方便地调用 Hndxing 库,开发者可以根据实际项目开发的需要,继承
ViewfinderView类,重写其onDraw(Canvas canvas)方法。下面是开放的其他接口:
| API | 说明 |
|---|---|
| CameraManager.get().turnLightOn(); | 打开手机的闪光灯; |
| CameraManager.get().turnLightOff(); | 关闭手机的闪光灯; |
| getBarcodeImage(String title); | 调用系统的相册(title 是打开对话框时的标题) |
一般来说,调用 getBarcodeImage(String title) 是为了获取相册里面的二维码或其他的码类,调用该接口,需要在已经继承了抽象类 BarCodeActivity 的生命周期函数 onCreate() 回调扫码结果方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setOnBarcodeImageChoseListener(new OnBarcodeImageChoseListener() {
@Override
public void onFail() {
//获取二维码图片失败后回调的的方法;
}
@Override
public void onSuccess(String resultContext, String barcodeFormatName) {
//获取二维码图片成功后回调的的方法;
}
});
}
小结
上面是 Hndxing 库开放的 API,这是笔者第一次尝试封装的模块库。因为在笔者最近的一个项目中,需要用到这个扫码功能,在开发的同时,也顺便把这个模块功能封装成一个开源库了。其中也是踩了挺多的坑的,哈哈,但是呢,还是踩坑踩过来了。当然,目前有许多大神也基于 Zxing 库封装了挺多优秀的开源库,但是呢,考虑到自己目前还是个大三学生,这个项目还是个学习阶段的,就没有用到其他的第三方优秀的扫码库了。