写点什么

检测图片中是否有二维码

作者:逆锋起笔
  • 2022 年 3 月 02 日
  • 本文字数:1644 字

    阅读完需:约 5 分钟

检测图片中是否有二维码

需求说明

从手机相册选择一张图片,或者是拍一张图片,然后通过代码去检测这张图片中是否有二维码,并给出对应的提示(Toast)。


本文利用打开系统相册功能实现选择图片,用到的技术支持是华为的依赖库,下面开始看具体实现。

配置工作

项目依赖库是基于 androidX的,app 下build.gradle中添加如下配置:


// 扫码图片中是否有二维码implementation 'com.huawei.agconnect:agconnect-core:1.4.0.300'implementation 'com.huawei.hms:scanplus:1.2.4.300'
复制代码


项目的build.gradle完整代码如下:


// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {    repositories {        google()        jcenter()        maven { url 'https://developer.huawei.com/repo/' }    }    dependencies {        classpath "com.android.tools.build:gradle:4.0.0"
classpath 'com.huawei.agconnect:agcp:1.4.1.300' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}
allprojects { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} }}
task clean(type: Delete) { delete rootProject.buildDir}
复制代码


示例只有一个页面,添加一个按钮即可,点击事件触发跳转相册选取图片并在回调onActivityResult()中判断是否有无二维码,该方法完整代码如下:


@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {    if (resultCode == RESULT_OK) {        try {            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());            //“QRCODE_SCAN_TYPE ”和“ DATAMATRIX_SCAN_TYPE表示只扫描QR和Data Matrix的码            HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).setPhotoMode(true).create();            HmsScan[] hmsScans = ScanUtil.decodeWithBitmap(this, bitmap, options);            //处理扫码结果            if (hmsScans != null && hmsScans.length > 0) {                //展示扫码结果                showResult(hmsScans);                Toast.makeText(this, "发现二维码", Toast.LENGTH_SHORT).show();            } else {                Toast.makeText(this, "没有发现二维码", Toast.LENGTH_SHORT).show();            }        } catch (IOException e) {            e.printStackTrace();        }    }    super.onActivityResult(requestCode, resultCode, data);}
private void showResult(HmsScan[] hmsScans) { for (int i = 0; i < hmsScans.length; i++) { Log.e(TAG, hmsScans[i].showResult); }}
复制代码


这里需要注意:


  • 清单文件中的读写文件权限必须添加

  • 代码中动态申请权限必须添加(示例中省略)

  • 适配 Android7.0+ Uri 无法被其它应用调用报``FileUriExposedException`异常问题(示例中省略)


跳转系统相册代码:


//data是Intent类型,data.getData是待扫描的条码图片UriIntent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, REQUEST_OK);
复制代码


以上工作确定都正确完成了,那么就可以测试了,实际效果这里不做演示了,没啥可看的,直接上手就行。

小结

华为技术真的不容小觑,已经提供了很多厉害的开源依赖了,本文的图片中二维码识别技术就是其一,另外如果你还继续使用zxing 来做扫码,那么我推荐你使用华为提供的技术,速度上更给力。


我是一名安卓开发工程师,最近正在学习 Java 后端知识,每天保持学习,掌握一项技能其实用不了多长时间,加油!

发布于: 2022 年 03 月 02 日阅读数: 22
用户头像

逆锋起笔

关注

公众号「逆锋起笔」主理人 2018.07.31 加入

程序视角,转射人生!

评论 (2 条评论)

发布
用户头像
标签是3月月更哦
1 小时前
回复
已更新
刚刚
回复
没有更多了
检测图片中是否有二维码_android_逆锋起笔_InfoQ写作平台