检测图片中是否有二维码
【摘要】 通过使用华为提供的技术,实现检测从相册或者拍照图片中是否存在二维码
需求说明
从手机相册选择一张图片,或者是拍一张图片,然后通过代码去检测这张图片中是否有二维码,并给出对应的提示(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)