检测图片中是否有二维码

举报
codexiaosheng 发表于 2022/02/28 17:10:52 2022/02/28
【摘要】 通过使用华为提供的技术,实现检测从相册或者拍照图片中是否存在二维码

image.png

需求说明

从手机相册选择一张图片,或者是拍一张图片,然后通过代码去检测这张图片中是否有二维码,并给出对应的提示(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()中判断是否有无二维码,该方法完整代码如下:

@Override
protected 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是待扫描的条码图片Uri
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_OK);

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

小结

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。