/ZXingLite

🔥 ZXing的精简版,优化扫码和生成二维码/条形码,内置闪光灯等功能。扫描风格支持:微信的线条样式,支付宝的网格样式。几句代码轻松拥有扫码功能 ,ZXingLite让集成更简单。(扫码识别速度快如微信)

Primary LanguageJavaApache License 2.0Apache-2.0

ZXingLite

Image

Download MavenCentral JCenter JitPack CI CircleCI API License Blog QQGroup

ZXingLite for Android 是ZXing的精简版,基于ZXing库优化扫码和生成二维码/条形码功能,扫码界面完全支持自定义,也可一行代码使用默认实现的扫码功能。总之你想要的都在这里。

简单如斯,你不试试? Come on~

Gif 展示

Image

你也可以直接下载 演示App 体验效果

ViewfinderView属性说明

属性 值类型 默认值 说明
maskColor color #60000000 扫描区外遮罩的颜色
frameColor color #7F1FB3E2 扫描区边框的颜色
cornerColor color #FF1FB3E2 扫描区边角的颜色
laserColor color #FF1FB3E2 扫描区激光线的颜色
labelText string 扫描提示文本信息
labelTextColor color #FFC0C0C0 提示文本字体颜色
labelTextSize dimension 14sp 提示文本字体大小
labelTextPadding dimension 24dp 提示文本距离扫描区的间距
labelTextWidth dimension 提示文本的宽度,默认为View的宽度
labelTextLocation enum bottom 提示文本显示位置
frameWidth dimension 扫码框宽度
frameHeight dimension 扫码框高度
laserStyle enum line 扫描激光的样式
gridColumn integer 20 网格扫描激光列数
gridHeight integer 40dp 网格扫描激光高度,为0dp时,表示动态铺满
cornerRectWidth dimension 4dp 扫描区边角的宽
cornerRectHeight dimension 16dp 扫描区边角的高
scannerLineMoveDistance dimension 2dp 扫描线每次移动距离
scannerLineHeight dimension 5dp 扫描线高度
frameLineWidth dimension 1dp 边框线宽度
scannerAnimationDelay integer 20 扫描动画延迟间隔时间,单位:毫秒
frameRatio float 0.625f 扫码框与屏幕占比
framePaddingLeft dimension 0 扫码框左边的内间距
framePaddingTop dimension 0 扫码框上边的内间距
framePaddingRight dimension 0 扫码框右边的内间距
framePaddingBottom dimension 0 扫码框下边的内间距
frameGravity enum center 扫码框对齐方式

引入

由于2021年2月3日 JFrog宣布将关闭Bintray和JCenter,计划在2022年2月完全关闭。 所以后续版本不再发布至 JCenter

Gradle:

  1. 在Project的 build.gradle 里面添加远程仓库
allprojects {
    repositories {
        //...
        mavenCentral()
    }
}
  1. 在Module的 build.gradle 里面添加引入依赖项
//AndroidX 版本
implementation 'com.github.jenly1314:zxing-lite:2.1.1'

以前发布至JCenter的版本

//AndroidX 版本
implementation 'com.king.zxing:zxing-lite:2.0.3'

v1.x 旧版本

//AndroidX 版本
implementation 'com.king.zxing:zxing-lite:1.1.9-androidx'

//Android Support 版本
implementation 'com.king.zxing:zxing-lite:1.1.9'

版本说明

v2.x 基于CameraX重构震撼发布

v2.x 相对于 v1.x 的优势

  • v2.x基于CameraX,抽象整体流程,可扩展性更高。
  • v2.x基于CameraX通过预览裁剪的方式确保预览界面不变形,无需铺满屏幕,就能适配(v1.x通过遍历Camera支持预览的尺寸,找到与屏幕最接近的比例,减少变形的可能性(需铺满屏幕,才能适配))

v2.x 特别说明

  • v2.x如果您是通过继承CaptureActivity或CaptureFragment实现扫码功能,那么动态权限申请相关都已经在CaptureActivity或CaptureFragment处理好了。
  • v2.x如果您是通过继承CaptureActivity或CaptureFragment实现扫码功能,如果有想要修改默认配置,可重写initCameraScan方法,修改CameraScan的配置即可,如果无需修改配置,直接在跳转原界面的onActivityResult 接收扫码结果即可(更多具体详情可参见app中的使用示例)。
关于CameraX
  • CameraX暂时还是Beta版,可能会存在一定的稳定性,如果您有这个考量,可以继续使用 ZXingLite 以前的 v1.x 版本。相信不久之后CameraX就会发布稳定版。

v1.x 说明

【v1.1.9】 如果您正在使用 1.x 版本请点击下面的链接查看分支版本,当前 2.x 版本已经基于 Camerx 进行重构,不支持升级,请在新项目中使用。

查看AndroidX版 1.x 分支 请戳此处

查看Android Support版 1.x 分支 请戳此处

查看 1.x API帮助文档

使用 v1.x 版本的无需往下看了,下面的示例和相关说明都是针对于当前最新版本。

示例

布局示例

可自定义布局(覆写getLayoutId方法),布局内至少要保证有PreviewView。

PreviewView 用来预览,布局内至少要保证有PreviewView,如果是继承CaptureActivity或CaptureFragment,控件id可覆写getPreviewViewId方法自定义

ViewfinderView 用来渲染扫码视图,给用户起到一个视觉效果,本身扫码识别本身没有关系,如果是继承CaptureActivity或CaptureFragment,控件id可复写getViewfinderViewId方法自定义,默认为previewView,返回0表示无需ViewfinderView

ivFlashlight 用来内置手电筒,如果是继承CaptureActivity或CaptureFragment,控件id可复写getFlashlightId方法自定义,默认为ivFlashlight。返回0表示无需内置手电筒。您也可以自己去定义

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <com.king.zxing.ViewfinderView
        android:id="@+id/viewfinderView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <ImageView
        android:id="@+id/ivFlashlight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/zxl_flashlight_selector"
        android:layout_marginTop="@dimen/zxl_flashlight_margin_top" />
</FrameLayout>

或在你的布局中添加

    <include layout="@layout/zxl_capture"/>

代码示例 (二维码/条形码)

    //跳转的默认扫码界面
    startActivityForResult(new Intent(context,CaptureActivity.class),requestCode);

    //生成二维码
    CodeUtils.createQRCode(content,600,logo);
    //生成条形码
    CodeUtils.createBarCode(content, BarcodeFormat.CODE_128,800,200);
    //解析条形码/二维码
    CodeUtils.parseCode(bitmap);
    //解析二维码
    CodeUtils.parseQRCode(bitmap);

CameraScan配置示例

    //获取CameraScan,扫码相关的配置设置。CameraScan里面包含部分支持链式调用的方法,即调用返回是CameraScan本身的一些配置建议在startCamera之前调用。
    getCameraScan().setPlayBeep(true)//设置是否播放音效,默认为false
            .setVibrate(true)//设置是否震动,默认为false
            .setCameraConfig(new CameraConfig())//设置相机配置信息,CameraConfig可覆写options方法自定义配置
            .setNeedAutoZoom(false)//二维码太小时可自动缩放,默认为false
            .setNeedTouchZoom(true)//支持多指触摸捏合缩放,默认为true
            .setDarkLightLux(45f)//设置光线足够暗的阈值(单位:lux),需要通过{@link #bindFlashlightView(View)}绑定手电筒才有效
            .setBrightLightLux(100f)//设置光线足够明亮的阈值(单位:lux),需要通过{@link #bindFlashlightView(View)}绑定手电筒才有效
            .bindFlashlightView(ivFlashlight)//绑定手电筒,绑定后可根据光线传感器,动态显示或隐藏手电筒按钮
            .setOnScanResultCallback(this)//设置扫码结果回调,需要自己处理或者需要连扫时,可设置回调,自己去处理相关逻辑
            .setAnalyzer(new MultiFormatAnalyzer(new DecodeConfig()))//设置分析器,DecodeConfig可以配置一些解码时的配置信息,如果内置的不满足您的需求,你也可以自定义实现,
            .setAnalyzeImage(true)//设置是否分析图片,默认为true。如果设置为false,相当于关闭了扫码识别功能
            .startCamera();//启动预览(如果是通过继承CaptureActivity或CaptureFragment实现扫码无需调用这句。)


    //设置闪光灯(手电筒)是否开启,需在startCamera之后调用才有效
    getCameraScan().enableTorch(torch);

CameraScan配置示例(只需识别二维码的配置示例)

        //初始化解码配置
        DecodeConfig decodeConfig = new DecodeConfig();
        decodeConfig.setHints(DecodeFormatManager.QR_CODE_HINTS)//如果只有识别二维码的需求,这样设置效率会更高,不设置默认为DecodeFormatManager.DEFAULT_HINTS
            .setFullAreaScan(false)//设置是否全区域识别,默认false
            .setAreaRectRatio(0.8f)//设置识别区域比例,默认0.8,设置的比例最终会在预览区域裁剪基于此比例的一个矩形进行扫码识别
            .setAreaRectVerticalOffset(0)//设置识别区域垂直方向偏移量,默认为0,为0表示居中,可以为负数
            .setAreaRectHorizontalOffset(0);//设置识别区域水平方向偏移量,默认为0,为0表示居中,可以为负数

        //在启动预览之前,设置分析器,只识别二维码
        getCameraScan()
                .setVibrate(true)//设置是否震动,默认为false
                .setAnalyzer(new MultiFormatAnalyzer(decodeConfig));//设置分析器,如果内置实现的一些分析器不满足您的需求,你也可以自定义去实现

通过继承CaptureActivity实现扫二维码完整示例

public class QRCodeActivity extends CaptureActivity {


    @Override
    public int getLayoutId() {
        return R.layout.qr_code_activity;
    }

    @Override
    public void initCameraScan() {
        super.initCameraScan();

        //初始化解码配置
        DecodeConfig decodeConfig = new DecodeConfig();
        decodeConfig.setHints(DecodeFormatManager.QR_CODE_HINTS)//如果只有识别二维码的需求,这样设置效率会更高,不设置默认为DecodeFormatManager.DEFAULT_HINTS
            .setFullAreaScan(false)//设置是否全区域识别,默认false
            .setAreaRectRatio(0.8f)//设置识别区域比例,默认0.8,设置的比例最终会在预览区域裁剪基于此比例的一个矩形进行扫码识别
            .setAreaRectVerticalOffset(0)//设置识别区域垂直方向偏移量,默认为0,为0表示居中,可以为负数
            .setAreaRectHorizontalOffset(0);//设置识别区域水平方向偏移量,默认为0,为0表示居中,可以为负数

        //在启动预览之前,设置分析器,只识别二维码
        getCameraScan()
                .setVibrate(true)//设置是否震动,默认为false
                .setNeedAutoZoom(true)//二维码太小时可自动缩放,默认为false
                .setAnalyzer(new MultiFormatAnalyzer(decodeConfig));//设置分析器,如果内置实现的一些分析器不满足您的需求,你也可以自定义去实现
    }


    /**
     * 扫码结果回调
     * @param result
     * @return 返回false表示不拦截,将关闭扫码界面并将结果返回给调用界面;
     *  返回true表示拦截,需自己处理逻辑。当isAnalyze为true时,默认会继续分析图像(也就是连扫)。
     *  如果只是想拦截扫码结果回调,并不想继续分析图像(不想连扫),请在拦截扫码逻辑处通过调
     *  用{@link CameraScan#setAnalyzeImage(boolean)},
     *  因为{@link CameraScan#setAnalyzeImage(boolean)}方法能动态控制是否继续分析图像。
     *
     */
    @Override
    public boolean onScanResultCallback(Result result) {
        /*
         * 因为setAnalyzeImage方法能动态控制是否继续分析图像。
         *
         * 1. 因为分析图像默认为true,如果想支持连扫,返回true即可。
         * 当连扫的处理逻辑比较复杂时,请在处理逻辑前调用getCameraScan().setAnalyzeImage(false),
         * 来停止分析图像,等逻辑处理完后再调用getCameraScan().setAnalyzeImage(true)来继续分析图像。
         *
         * 2. 如果只是想拦截扫码结果回调自己处理逻辑,但并不想继续分析图像(即不想连扫),可通过
         * 调用getCameraScan().setAnalyzeImage(false)来停止分析图像。
         */
        return super.onScanResultCallback(result);
    }
}

如果直接使用CaptureActivity需在您项目的AndroidManifest中添加如下配置

    <activity
        android:name="com.king.zxing.CaptureActivity"
        android:screenOrientation="portrait"
        android:theme="@style/CaptureTheme"/>

快速实现扫码有以下几种方式:

1、直接使用CaptureActivity或者CaptureFragment。(纯洁的扫码,无任何添加剂)

2、通过继承CaptureActivity或者CaptureFragment并自定义布局。(适用于大多场景,并无需关心扫码相关逻辑,自定义布局时需覆写getLayoutId方法)

3、在你项目的Activity或者Fragment中实例化一个CameraScan即可。(适用于想在扫码界面写交互逻辑,又因为项目架构或其它原因,无法直接或间接继承CaptureActivity或CaptureFragment时使用)

4、继承CameraScan自己实现一个,可参照默认实现类DefaultCameraScan,其它步骤同方式3。(扩展高级用法,谨慎使用)

其他

需使用JDK8+编译,在你项目中的build.gradle的android{}中添加配置:

compileOptions {
    targetCompatibility JavaVersion.VERSION_1_8
    sourceCompatibility JavaVersion.VERSION_1_8
}

更多使用详情,请查看app中的源码使用示例或直接查看API帮助文档

相关推荐

MLKit 一个强大易用的工具包。通过ML Kit您可以很轻松的实现文字识别、条码识别、图像标记、人脸检测、对象检测等功能。

WeChatQRCode 基于OpenCV开源的微信二维码引擎移植的扫码识别库。

版本记录

v2.1.1:2021-8-4

  • 更新CameraX至v1.0.1
  • 优化CameraConfig的一些默认配置

v2.1.0:2021-6-30 (从v2.1.0开始发布至 MavenCentral)

  • 更新CameraX至v1.0.0
  • 优化细节

v2.0.3:2021-3-26

  • 更新CameraX至v1.0.0-rc03
  • 优化一些默认配置

v2.0.2:2021-1-14

  • ViewfinderView 新增 labelTextWidth 属性

v2.0.1:2020-12-30

  • 更新CameraX至v1.0.0-rc01
  • 新增支持点击预览区域对焦目标
  • 修改一些默认配置
  • 优化细节

v2.0.0:2020-12-24

  • 基于CameraX进行重构
  • 抽象整体流程,可扩展性更高
  • 从2.x开始只支持AndroidX
  • minSdk要求从 16+ 改为 21+

赞赏

如果您喜欢ZXingLite,或感觉ZXingLite帮助到了您,可以点右上角“Star”支持一下,您的支持就是我的动力,谢谢 😃

您也可以扫描下面的二维码,请作者喝杯咖啡 ☕

关于我

Name: Jenly

Email: jenly1314#gmail.com / jenly1314#vip.qq.com

CSDN: jenly121

CNBlogs: jenly

GitHub: jenly1314

Gitee: jenly1314

加入QQ群: 20867961