评论

收藏

[Android] 二维码污损、反光、距离远还能扫出来吗?统一扫码服务告诉你,能!

移动开发 移动开发 发布于:2022-05-27 10:00 | 阅读数:633 | 评论:0

二维码和条形码从发明到发展已经过去了几十年,因其能快捷方便读取信息的特点,在数字经济时代被广泛应用。扫描二维码可以识别健康状况,识别身份信息、访问网站链接、完成金融支付等等,已经成为生活中不可或缺的实用技术,所以很多App都搭载了“扫一扫”功能。
然而,在日常扫码过程中,我们也经常会遇到扫码环境暗、二维码污损、模糊等情况,导致识别二维码困难。HMS Core 统一扫码服务(Scan Kit)为常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,还能实现远距离码或小型码的检测和自动放大,提升扫码成功率与用户体验。
1.远距离扫码
普通的二维码扫描器只读距离不超过30厘米,然而我们生活中经常出现远距离扫码的情况,例如停车场远距离扫码缴费、公众场合扫码签到等,普通的扫码服务在这时候就会出现扫码困难的情况。统一扫码服务,由于在扫码处理流程中多了一个预检测的功能,即使是肉眼无法分辨,也可以很好的自动放大超远距离的二维码。
DSC0000.gif

2.二维码污损
二维码污损也是户在日常扫码中经常遇到的情况,比如扫码骑行时遇到二维码破损,扫描纸质二维码因为纸张破损二维码不完整的情况也常有出现,统一扫码服务基于多项计算机视觉技术,可以大幅提升复杂场景识别率。
当然,HMS Core 统一扫码服务除了支持污损二维码扫描,遇到反光,暗光等场景,甚至将二维码贴在商品上时出现曲面或棱角的情况,也能成功扫码;哪怕你边走动边扫码,此时的二维码模糊不清也不影响扫码的准确率。
DSC0001.gif

3.多码识别
在仓库清点、收发货物时,常常遇到摆满了货物,上面都贴上条形码的情况,如果工人一个个扫码清点,效率非常低。多码识别可以帮助仓库清点,快递收发等场景实现一次识别多个码,提升业务处理效率。多码识别模式下,Scan Kit一次最多可以同时识别不限种类的5个码。
DSC0002.gif

4.多角度扫码
有时由于环境的限制,我们不一定能扫到正面角度的二维码, 统一扫码服务基于自动检测及旋转纠正能力,识别区域更宽(侧面和侧面+45°),支持用户从任意角度扫码,可自动校正快速识别二维码,即使位置不方便也能正确识别,从而提升应用扫码灵活度和识别率。
DSC0003.gif

开发步骤
统一扫码服务提供多元的接入方式,最少5行代码即可拥有强大的扫码能力,开发者可以直接使用Scan Kit提供的默认扫码页面,也可以基于Scan Kit提供的示例代码,快速自定义扫码功能。以下我会以Default View Mode为例,展示具体的集成步骤。
开发前准备

  • 在项目级”setting.gradle”中配置HMS Core maven仓地址
pluginManagement {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
    // 配置HMS Core SDK的Maven仓地址。
    maven { url 'https://developer.huawei.com/repo/' }
  }
}
dependencyResolutionManagement {
  ...
  repositories {
    google()
    mavenCentral()
    // 配置HMS Core SDK的Maven仓地址。
    maven { url 'https://developer.huawei.com/repo/' }
  }
}
2.在应用级的build.gradle上添加编译依赖
dependencies{ 
  implementation 'com.huawei.hms:scanplus:2.4.0.302' 
 }

  • 配置混淆脚本
-ignorewarnings 
-keepattributes *Annotation*  
-keepattributes Exceptions  
-keepattributes InnerClasses  
-keepattributes Signature  
-keepattributes SourceFile,LineNumberTable  
-keep class com.hianalytics.android.**{*;}  
-keep class com.huawei.**{*;}

  • 在“AndroidManifest.xml”中指定相机权限和文件读取权限,并动态申请权限
<!--相机权限--> 
<uses-permission android:name="android.permission.CAMERA" /> 
<!--读文件权限--> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
// CAMERA_REQ_CODE为用户自定义,用于接收权限校验结果的请求码。
this.requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_REQ_CODE);

  • 校验是否开启相应的权限,决定是否继续扫码。
// 实现“onRequestPermissionsResult”函数接收校验权限结果。
final int PERMISSIONS_LENGTH = 2;
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  // 判断“requestCode”是否为申请权限时设置请求码CAMERA_REQ_CODE,然后校验权限开启状态。
  if (requestCode == CAMERA_REQ_CODE && grantResults.length == PERMISSIONS_LENGTH && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
    // 调用扫码接口,构建扫码能力。
    ...
  }
}
构建扫码功能

  • 根据实际需求创建扫码选项参数。
// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只扫描QR和Data Matrix的码
HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).create();

  • 调用ScanUtil的静态方法startScan启动Default View扫码页面。用户可以使用相机扫码,也可以通过该页面的“导入图片”按钮检测图片中的码。
ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, options);

  • 实现回调接口接收扫码结果,相机扫码和导入图片扫码均通过该接口返回。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (resultCode != RESULT_OK || data == null) {
    return;
  }
  if (requestCode == REQUEST_CODE_SCAN_ONE) {
    // 导入图片扫描返回结果
    HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);
    if (obj != null) {
      // 展示解码结果
      showResult(obj);
     }
  }
}
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~