设为首页 加入收藏

TOP

zxing开源库的基本使用(一)
2019-09-01 23:26:59 】 浏览:85
Tags:zxing 开源 基本 使用

如果你的项目中有模块跟二维码相关的话,那你一定听过或者用过大名鼎鼎的zxing开源库。

什么是zxing?

ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。

本篇文章就来学习zxing的基本使用,学习了以下几个内容就能满足大部分项目中的二维码相关需求:

  • 通过摄像头扫描二维码图片,读取图片内容
  • 从相册中选取二维码图片,读取图片内容
  • 自己输入字符串内容,生成二维码图片
  • 长按识别自己生成的二维码图片

如何依赖zxing到项目中?

如果你还在使用zxing的jar包、或者你是把zxing的代码复制到项目中,使用这两种方式依赖的话那就out了,现在Android Studio可支持zxing在线依赖,目前最新版本是3.3.3。在线依赖的好处我就不多说了,相信大家都懂。

新建项目,在app/build.gradle文件中在线依赖:

implementation 'com.google.zxing:core:3.3.3'

加入权限

因为扫描二维码需要摄像头权限,把图片保存到本地需要sdcard权限,所以需要在AndroidManifest.xml中加入相应的权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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

当然现在市面上的手机大部分都是6.0以上的操作系统了,所以还得在MainActivity的onCreate方法中动态申请以上这两个权限。

 //6.0版本或以上需请求权限
String[] permissions=new String[]{Manifest.permission.
        WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
    requestPermissions(permissions,PERMS_REQUEST_CODE);
}

扫描二维码

项目依赖进来了,权限也有了,开始用代码实现第一个功能。点击扫描二维码按钮,开启一个ScanActivity,这个Activity是我之前封装好的,里面处理了扫描二维码的整个流程,扫描成功后会把扫描结果返回。ScanActivity类的代码有点多,就不贴出来了,有兴趣的自己看源码。

Intent intent = new Intent(MainActivity.this,ScanActivity.class);
startActivityForResult(intent,SCAN_REQUEST_CODE);

重写onActivityResult方法,监听扫描结果。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == SCAN_REQUEST_CODE && resultCode == RESULT_OK) {
        String input = intent.getStringExtra(ScanActivity.INTENT_EXTRA_RESULT);
        showToast("扫描结果:"+input);
    }
}

从相册中选择二维码图片进行识别

首先启动系统相册,从相册中选择一张图片。

Intent innerIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
startActivityForResult(wrapperIntent, SELECT_IMAGE_REQUEST_CODE);

然后在onActivityResult中获取选择图片路径,调用BitmapUtil.parseQRcode方法解析二维码图片。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if(requestCode==SELECT_IMAGE_REQUEST_CODE){//从图库选择图片
        String[] proj = {MediaStore.Images.Media.DATA};
        // 获取选中图片的路径
        Cursor cursor = this.getContentResolver().query(intent.getData(),proj, null, null, null);
        if (cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            String photoPath = cursor.getString(columnIndex);
            String result= BitmapUtil.parseQRcode(photoPath);
            if (!TextUtils.isEmpty(result)) {
                showToast("从图库选择的图片识别结果:"+result);
            } else {
                showToast("从图库选择的图片不是二维码图片");
            }
        }
        cursor.close();
    }
}

接下来看parseQRcode方法,

/**
 * 解析二维码图片
 * @param bitmapPath 文件路径
 * @return
 */
public static String parseQRcode(String bitmapPath){
    Bitma
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android 技能图谱学习路线 下一篇利用AccessibilityService自动获..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目