• 使用华为API接口实现图片检测是否有二维码
  • 发布于 2个月前
  • 782 热度
    0 评论
需求说明
从手机相册选择一张图片,或者是拍一张图片,然后通过代码去检测这张图片中是否有二维码,并给出对应的提示(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);
    }
}
这里需要注意:
1.清单文件中的读写文件权限必须添加
2.代码中动态申请权限必须添加(示例中省略)
3.适配 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 来做扫码,那么我推荐你使用华为提供的技术,速度上更给力。
用户评论