二维码识别技术已广泛应用在移动支付、实用工具、电商购物、社交通讯等场景。然而,在实际生活中,二维码容易遇到距离远、暗光、强光、污损、模糊和大角度倾斜等复杂场景,导致识别困难,扫码体验差。华为HMS Core 统一扫码服务(Scan Kit)为开发者们的APP带来一站式扫码解决方案,并且拥有高识别率和快速识别等特点。

距离太远、码图过小?

在停车场扫码缴费、上课扫码签到、广告牌宣传等实际生活场景中,二维码的尺寸不一,一般的扫码功能需手动调节手机相机框与二维码的距离直到合适的扫码大小,实属不便。统一扫码服务基于自研的深度学习算法模型,遇到远距离场景、码图过小、甚至肉眼无法分辨的情况,支持自动检测放大,智能识别。

多角度、光线不佳、模糊等复杂场景无法识别?

餐桌、共享单车、充电桩等设备上的二维码,易受环境或人为影响,导致污损、模糊、反光,无法清晰展示,造成识别困难。统一扫码服务基于多项计算机视觉技术,可以大幅提升复杂场景识别率,统一扫码服务可以自动检测及旋转纠正,能够在识别任意角度的同时保证准确率。

单个扫码效率低?

在录入商品信息、快递信息等需要频繁扫码的场景中,一般的扫码功能识别成功后会自动跳转,操作不便。统一扫码服务为您带来连续扫码功能,对相机内连续出现的二维码识别检测,避免识别成功自动跳转的问题。同时,多码识别模式下,统一扫码服务最多可同时识别不限种类的5个码,大幅提升工作效率。

另外,HMS Core 统一扫码服务为助力开发者们构建流畅的扫码体验,带来更加完善的功能:

①支持识别/生成13种主流码格式;

②支持自定义扫码界面;

③支持分析12个场景的码内容,提取结构化数据;

④提供内存 1.1M / 3.3M 两种SDK及4种不同类型的调用方式,安卓版本最少5行代码即可快速接入。

下面是接入 HMS Core 统一扫码服务的开发步骤,以Default View Mode为例,只需简单的集成就可为应用构建扫码能力。

开发步骤1.开发准备

详细准备步骤可参考华为开发者联盟官网。

2.集成准备

Default View Mode提供相机扫码和导入图片扫码两个功能,提供完整的Activity,不需要您开发扫码界面。

注意:使用此种模式请确保您的应用没有关闭硬件加速,即“hardwareAccelerated”为“true”。否则在个别机型可能会出现黑屏问题。

3.业务流程

使用Default View Mode的主要业务流程如下:

  1. 用户打开App发起扫码申请。

  2. 校验是否有相机权限。

  3. 权限验证通过后,调用HMS Core SDK的startScan扫码接口,启动扫码界面。若需要满足最小权限和场景化触发要求,文件读取权限在用户点击后触发场景,需要设置错误监听,检测到无文件读取权限,Scan Kit报错退出Default View。

  4. 判断扫码页面启动状态。

  5. HMS Core SDK回调应用的“onActivityResult”接口。

  6. 根据扫码状态RESULT_CODE获取扫码结果:若SUCCESS返回结果给用户;若结果为ERROR_NO_READ_PERMISSION,需要应用主动申请文件读取权限,重新进入Default View。

  7. App封装扫码结果返回给用户。

  1. 开发步骤
  1. (可选)根据实际需求创建扫码选项参数。

Scan Kit默认支持13种码制式,您也可以指定Scan Kit只扫描特定的码制式以提高扫码速度。例如,当仅需要检测QR码和DataMatrix码时,请按照以下示例构建HmsScanAnalyzerOptions对象。如果不限制检测码格式,您可以不创建HmsScanAnalyzerOptions对象。“1”为您设置的扫码标题样式参数,对应setViewType方法中的“var1”参数。

// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只扫描QR和DataMatrix的码,setViewType设置扫码标题,0表示设置扫码标题为”扫描二维码/条码“,1表示设置扫码标题为”扫描二维码“,默认为0;setErrorCheck设置错误监听,true表示监听错误并退出扫码页面,false表示不上报错误,仅检查到识别结果后退出扫码页面,默认为falseHmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE,HmsScan.DATAMATRIX_SCAN_TYPE).setViewType(1).setErrorCheck(true).create();
  1. 调用ScanUtil的静态方法startScan启动Default View扫码页面。用户可以使用相机扫码,也可以通过该页面的“导入图片”按钮检测图片中的码。

“REQUEST_CODE_SCAN_ONE”为您设置的请求码参数,对应“onActivityResult”方法中的“requestCode”参数,用于判断“onActivityResult”调用是否来自Scan Kit扫码结果回调。若“requestCode”参数等于您设置的请求码参数,则表示本次“onActivityResult”是Scan Kit的扫码结果回调。

如果您没有指定只检测特定的码制式,此处的options可以置为“null”,表示默认检测Scan Kit支持的码制式。

ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, options);
  1. 实现回调接口接收扫码结果,相机扫码和导入图片扫码均通过该接口返回。

    调用Activity的“onActivityResult”方法获取Intent参数,扫描结果对象HmsScan封装在其中。如何获取Intent参数请参见RESULT。

若“requestCode”等于步骤2中定义的“REQUEST_CODE_SCAN_ONE”请求码参数,则表示本次接收的Intent是Scan Kit返回的结果。

通过Intent中的RESULT_CODE获取扫码状态。

通过Intent中的RESULT获取扫码结果HmsScan,其中包含的信息参见码值解析。

@Overrideprotected 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) {        // 导入图片扫描返回结果        int errorCode = data.getIntExtra(ScanUtil.RESULT_CODE, ScanUtil.SUCCESS);        if (errorCode == ScanUtil.SUCCESS) {        Object obj = data.getParcelableExtra(ScanUtil.RESULT);        if (obj != null) {                // 展示扫码结果        ...            }    }        if (errorCode == ScanUtil.ERROR_NO_READ_PERMISSION) {            // 无文件权限,请求文件权限        ...        }    }}

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解 HMS Core 最新技术资讯~