简介

华为统一扫码服务(Scan Kit)提供便捷的条形码和二维码扫描、解析、生成能力,帮助您快速构建应用内的扫码功能。
得益于华为在计算机视觉领域能力的积累,Scan Kit可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,提升扫码成功率与用户体验。

您将建立什么

在本篇Codelab中,你将创建一个使用Default View Mode的扫码App。

您将会学到什么

硬件要求

  1. 安装了Android Studio的开发计算机。
  2. Android 4.4 (SDK Version 19) 及以上Android机型。

软件要求

若您需要正式发布集成Scan Kit的应用,请参考《HUAWEI HMS Core 集成准备》中详细说明来完成接入准备。
若您使用本Codelab Demo验证时,直接使用Sample Code中的设置,可以跳过此步骤。

Sample Code下载

针对Android Studio开发环境,华为提供了Maven仓集成方式的HMS Core SDK包。在开始开发前,您需要将HMS Core SDK集成到您的Android Studio开发环境中。

添加当前应用的AppGallery Connect配置文件

如果在AppGallery Connect中开通了相关服务则需要将"agconnect-services.json"文件添加到您的App中。

  1. 登录AppGallery Connect网站,点击"我的项目"。
  2. 在项目列表中找到您的项目,在项目中点击需要集成HMS Core SDK的应用。
  3. 在"项目设置 > 常规"页面的"应用"区域,点击"agconnect-services.json"下载配置文件。
  4. 将"agconnect-services.json"文件拷贝到应用级根目录下。

配置HMS Core SDK的Maven仓地址

  1. 打开Android Studio项目级"build.gradle"文件。
  2. 添加HUAWEI agcp插件以及Maven代码库。
    • 在"allprojects > repositories"中配置HMS Core SDK的Maven仓地址。
    • 在"buildscript > repositories"中配置HMS Core SDK的Maven仓地址。
    • 如果App中添加了"agconnect-services.json"文件则需要在"buildscript > dependencies"中增加agcp配置。
      buildscript { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} } dependencies { ... // 增加agcp配置。 classpath 'com.huawei.agconnect:agcp:1.4.2.300' } } allprojects { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} } }

添加编译依赖

  1. 打开应用级的"build.gradle"文件。
  2. 在"dependencies"中添加如下编译依赖,{version}需要替换为实际的SDK版本号,版本号索引请参见版本更新说明。如当前版本:implementation ‘com.huawei.hms:scan:1.3.2.300'。
    dependencies { implementation 'com.huawei.hms:scan:{version}' }
  3. 添加agcp插件配置。请根据实际情况选择:
    • 方式一:在文件头部声明下一行添加如下配置。
      apply plugin: 'com.huawei.agconnect'
    • 方式二:在plugins中添加如下配置。
      plugins { id 'com.android.application' // 添加如下配置 id 'com.huawei.agconnect' }
  4. 同步工程。在完成以上的配置后,点击工具栏中的gradle同步图标,完成"build.gradle"文件的同步,将相关依赖下载到本地。
  1. 在调用Scan Kit时,开发者需要先在AndroidManifest.xml文件声明相应的权限。Android提供了两种扫码权限:CAMERA(相机权限)和READ_EXTERNAL_STORAGE(读文件权限)。如果已在Sample demo code中申请权限,不需要重复申请。
    <!–相机权限–>
    <uses-permission android:name="android.permission.CAMERA" />
    <!–读文件权限–>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
  2. 声明权限后,还需要在代码中动态申请一下权限。在MainActivity.java中,增加:
    Java示例代码:
    public void newViewBtnClick(View view) { //DEFAULT_VIEW为用户自定义用于接收权限校验结果 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { this.requestPermissions( new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, DEFAULT_VIEW); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (permissions == null || grantResults == null || grantResults.length < 2 || grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { return; } }

    Kotlin示例代码:

    public fun newViewBtnClick(view:View?) { //DEFAULT_VIEW为用户自定义用于接收权限校验结果 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { this.requestPermissions( arrayOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE), DEFAULT_VIEW) } } override fun onRequestPermissionsResult(requestCode:Int, permissions:Array<out String>, grantResults:IntArray) { if (permissions == null || grantResults.size< 2 || grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { return } if (requestCode == DEFAULT_VIEW) { //调用DefaultView扫码界面 ScanUtil.startScan(this@MainActivity, REQUEST_CODE_SCAN, HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()) } }

Scan Kit提供4种不同的调用模式,具体的差别参见《开发指南》。本选择了Default View Mode进行开发,实现扫码功能。

调用Default View Mode扫码页面

Java示例代码:

//申请权限之后,调用DefaultView扫码界面
int result = ScanUtil.startScan(MainActivity.this, REQUEST_CODE_SCAN, new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create());

Kotlin示例代码:

//申请权限之后,调用DefaultView扫码界面
ScanUtil.startScan(this@MainActivity, REQUEST_CODE_SCAN, HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create())

处理扫码结果

在MainActivity中处理扫码结果,在Sample Code MainActivity.java文件中,增加:
Java示例代码:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //当扫码页面结束后,处理扫码结果 super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK || data == null) { return; } //从onActivityResult返回data中,用ScanUtil.RESULT作为key值取到HmsScan返回值 if (requestCode == REQUEST_CODE_SCAN) { Object obj = data.getParcelableExtra(ScanUtil.RESULT); if (obj instanceof HmsScan) { if (!TextUtils.isEmpty(((HmsScan) obj).getOriginalValue())) { Toast.makeText(this, ((HmsScan) obj).getOriginalValue(), Toast.LENGTH_SHORT).show(); } return; } } }

Kotlin示例代码:

override fun onActivityResult(requestCode:Int, resultCode:Int, data:Intent?) { //当扫码页面结束后,处理扫码结果 super.onActivityResult(requestCode, resultCode, data) if (resultCode != RESULT_OK || data == null) { return } //从onActivityResult返回data中,用ScanUtil.RESULT作为key值取到HmsScan返回值 if (requestCode == REQUEST_CODE_SCAN) { var obj:Any? = data?.getParcelableExtra(ScanUtil.RESULT) if (obj is HmsScan?) { if (!TextUtils.isEmpty(obj?.getOriginalValue())) { Toast.makeText(this, obj?.getOriginalValue(), Toast.LENGTH_SHORT).show() } return } } }

完成开发后,点击开发界面上的运行图标,运行Android Studio工程打包生成APK,并安装在测试手机上。
首次进入应用时的界面:

点击Default View Mode:

扫码后返回结果:

干得好,你已经成功完成了Codelab并学到了:

如需了解更多与华为Scan Kit相关的信息,请关注我们的官方网站。开发过程中如果遇见问题,请参考我们的常见问题解答

您可以阅读下面链接,了解更多相关的信息。

点击下载源码
Code copied