写点什么

扫一扫,原来这么简单

作者:HMS Core
  • 2023-03-22
    贵州
  • 本文字数:2514 字

    阅读完需:约 8 分钟

二维码识别技术已广泛应用在移动支付、实用工具、电商购物、社交通讯等场景。然而,在实际生活中,二维码容易遇到距离远、暗光、强光、污损、模糊和大角度倾斜等复杂场景,导致识别困难,扫码体验差。华为 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表示不上报错误,仅检查到识别结果后退出扫码页面,默认为false
HmsScanAnalyzerOptions 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. 实现回调接口接收扫码结果,相机扫码和导入图片扫码均通过该接口返回。

  2. 调用 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) {            // 无文件权限,请求文件权限        ...        }    }}
复制代码


了解更多详情>>


访问华为开发者联盟官网


获取开发指导文档


华为移动服务开源仓库地址:GitHubGitee


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

用户头像

HMS Core

关注

HMS Core技术团队。 2022-06-16 加入

分享最新的技术干货,带来最全的能力应用场景,更新热门开发者圈子活动。与开发者一起,同成长,共精彩。

评论

发布
暂无评论
扫一扫,原来这么简单_HMS Core_HMS Core_InfoQ写作社区