基于 Zxing 封装的 Hndxing 扫码库

821 阅读4分钟

前言

Hndxing 是一个基于 ZXing 源码的基础上面,抽离其出 Android 端的扫码功能,而进一步封装而成的一个开源库 。相信有过封装 Zxing 官方源码的经历的话,都会遇到在竖屏的时候,无法在竖屏时正常扫一维码,扫一维码的时候,需要把手机横着扫码,这就会给用户造成非常不好的体验;而且在扫二维码的时候,需要把手机和需要扫的码保持一定的距离,才可以正常扫码,这也是会带给用户非常不好的体验的;造成这些的原因,除了跟移动的手机端的摄像机硬件模块的成像特点有一定的关系,也是和 Zxing 的相关源码有一定的关系。哈哈,当然,这一篇笔者就先不讨论造成上面的两者的原因,而是主要介绍笔者封装的扫码库的如何使用。

特性

  • 提供在竖屏状态下设别一维码、二维码的功能;
  • 优化在竖屏状态识别一维码、二维码的速度、距离;

效果

原生的 Hndroid 效果(因为虚拟机不具有摄像头,所以显示的是黑灰格)

Hndxing 的原生效果

由开发者自定义后的 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 库封装了挺多优秀的开源库,但是呢,考虑到自己目前还是个大三学生,这个项目还是个学习阶段的,就没有用到其他的第三方优秀的扫码库了。

Hndxing 源码库地址