张可的博客

【QRCodeView】更专注的二维码扫描控件

QRCodeView

基于 com.google.zxing 开发,用于简化 Android 设备扫描、生成二维码等操作。

前言

QRCodeView 基于 Google 的 zxing 进行二次开发,简化二维码的相关操作、优化识别速度。由于整个 zxing 框架中不仅包含了二维码识别相关的代码,还包括其他格式如条形码等等的代码,体量较大,实际开发中一般只需要使用二维码,故本项目中删除了不必要的代码。本项目不仅提供了使用摄像头预览实时识别二维码,还有如生成一张二维码图片,生成一张带有 logo 的二维码图片等等。 注意:此项目只支持二维码,不支持其他格式的条码!

效果图

预览图

集成方式

在 app/build.gradle 中添加依赖:

implementation 'com.github.0xZhangKe:QRCodeView:1.3'

如果依赖失败还要在根目录的 builde.gradle 中添加仓库:

maven { url = 'https://jitpack.io' }

使用方式

使用起来很简单,先看一下布局文件:

<com.zhangke.qrcodeview.QRCodeView
    android:id="@+id/qr_code_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:showSlider="true"
    app:sliderColor="@android:color/holo_green_dark"
    app:showPoint="true"
    app:pointColor="@color/colorAccent"
    app:frameColor="@android:color/white"/>

再看下 java 代码:

package com.zhangke.qrcodeview.sample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.google.zxing.Result;
import com.zhangke.qrcodeview.QRCodeView;
import com.zhangke.qrcodeview.smaple.R;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private QRCodeView qrCodeView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        qrCodeView = (QRCodeView) findViewById(R.id.qr_code_view);
        qrCodeView.setOnQRCodeListener(new QRCodeView.OnQRCodeRecognitionListener() {
            @Override
            public void onQRCodeRecognition(Result result) {
                Toast.makeText(MainActivity.this, result.getText(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        qrCodeView.startPreview();
    }

    @Override
    protected void onPause() {
        qrCodeView.stopPreview();
        super.onPause();
    }
}

是不是很简单?就是根据声明周期初始化一下,设置个回调就 OK 了,对了别忘记添加权限:

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

将 QRCodeView 添加到自己的项目中

首先打开 QRCodeView 项目: https://github.com/0xZhangKe/QRCodeView

其中有两个 model:lib 和 sample ,sample 是使用的案例,不会使用的可以参照其中的代码。lib 即核心代码,可以将整个项目 clone 到本地,然后将 lib 添加到自己的项目中,然后设置好依赖就行了。 或者也可以直接将 lib 下面的代码复制到你自己的项目中。

类文档

QRCodeViewView

包名:

com.zhangke.qrcodeview

描述:

二维码预览 View。

XML attributes:

参数名 介绍
app:facing 前置或后置摄像头
app:showFrame 是否显示边框,默认显示
app:frameColor 边框颜色,默认为白色
app:showPoint 是否绘制二维码可能出现区域的点,默认不显示
app:pointColor 点的颜色,默认为红色
app:showSlider 是否开启扫描动画,默认显示
app:sliderColor 扫描条的颜色,默认绿色

Public constructors

public QRCodeView(Context context)
public QRCodeView(Context context, AttributeSet attrs)
public QRCodeView(Context context, AttributeSet attrs, int defStyleAttr)

Public methods

name describe
void startPreview() 开始预览,一般在 onResume() 中调用
void stopPreview() 停止预览,一般在 onPause() 中调用
boolean isPreview() 当前是否正在预览
Camera getCamera() 获取 Camera 对象
void setOnQRCodeListener(OnQRCodeRecognitionListener onQRCodeListener) 设置二维码识别监听器

OnQRCodeRecognitionListener

包名:

com.zhangke.qrcodeview.QRCodeViewView

描述: 二维码识别监听器

name describe
void onQRCodeRecognition(Result result) 识别到二维码时会回调此方法

QRCodeUtil

包名:

com.zhangke.qrcodeview

描述: 二维码相关工具类。

name describe
static Bitmap createQRCode(String text) throws WriterException 根据文本创建二维码图片
static Bitmap createQRCode(String text, Bitmap logo) 根据文本及 logo 创建一个带有 logo 的二维码图片
static String decodeQRCode(Bitmap bitmap) 识别一张二维码图片,返回其中的文本