简介

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

您将建立什么

在本篇codelab中,你将创建一个使用Bitmap Mode的扫码App。

您将会学到什么

硬件要求

软件要求

若您需要正式发布集成Scan Kit的应用,请参见《HUAWEI HMS Core 集成准备》中详细说明来完成接入准备。

针对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代码库。
    • 在"buildscript > repositories"中配置HMS Core SDK的Maven仓地址。
    • 在"allprojects > 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插[最新版本](https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-sdk-changenotes-0000001058732550)推荐您使用最新版本的agcp插件。 classpath 'com.huawei.agconnect:agcp:1.6.0.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文件中增加相应的权限。如果已在Sample code中申请权限,不需要重复申请。
    <!--读文件权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. 声明权限后,还需要在代码中动态申请一下权限。在MainActivity.java中,增加:
    Java示例代码:
    public static final int BITMAP = 0x22; public static final int REQUEST_CODE_PHOTO = 0x33; public void newViewBtnClick(View view) { // BITMAP为用户自定义用于接收权限校验结果。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { this.requestPermissions( new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, BITMAP); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (permissions == null || grantResults == null || grantResults[0] != PackageManager.PERMISSION_GRANTED) { return; } if (requestCode == BITMAP) { // 调用系统相册。 Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); MainActivity.this.startActivityForResult(pickIntent, REQUEST_CODE_PHOTO); } }

    Kotlin示例代码:

    val BITMAP = 0x22; val REQUEST_CODE_PHOTO = 0x33; fun newViewBtnClick(view: View?) { // BITMAP为用户自定义用于接收权限校验结果。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { this.requestPermissions( arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), BITMAP) } } override fun onRequestPermissionsResult(requestCode:Int, permissions:Array, grantResults:IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (permissions == null || grantResults == null || grantResults[0] != PackageManager.PERMISSION_GRANTED) { return } if (requestCode == MainActivity.BITMAP) { // 调用系统相册。 val pickIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*") this@MainActivity.startActivityForResult(pickIntent, REQUEST_CODE_PHOTO) } }

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

  1. 获取系统相册返回的Bitmap,具体示例代码请参见开发指南
  2. 调用decodeWithBitmap扫码接口。在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; } if (requestCode == REQUEST_CODE_PHOTO) { // 获取图片路径。 final String path = getImagePath(MainActivity.this, data); if (TextUtils.isEmpty(path)) { return; } // 从图片路径获取Bitmap。 Bitmap bitmap = ScanUtil.compressBitmap(MainActivity.this, path); // 调用decodeWithBitmap方法,传入Bitmap。 HmsScan[] result1 = ScanUtil.decodeWithBitmap(MainActivity.this, bitmap, new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(0).setPhotoMode(false).create()); // 获取具体扫码结果。 if (result1 != null && result1.length > 0) { if (!TextUtils.isEmpty(result1[0].getOriginalValue())) { Toast.makeText(this, result1[0].getOriginalValue(), Toast.LENGTH_SHORT).show(); } } } }

    Kotlin示例代码:

    override fun onActivityResult(requestCode:Int, resultCode:Int, data: Intent?) { // 扫描页面关闭,接收到扫描结果。 super.onActivityResult(requestCode, resultCode, data) if (resultCode != RESULT_OK || data == null) { return } if (requestCode == REQUEST_CODE_PHOTO) { // 获取图片路径。 val path = getImagePath(this@MainActivity, data) if (TextUtils.isEmpty(path)) { return } // 从图片路径获取Bitmap。 val bitmap = ScanUtil.compressBitmap(this@MainActivity, path) // 调用decodeWithBitmap方法,传入Bitmap。 val result1 = ScanUtil.decodeWithBitmap(this@MainActivity, bitmap, HmsScanAnalyzerOptions.Creator().setHmsScanTypes(0).setPhotoMode(false).create()) // 获取具体扫码结果。 if (result1 != null && result1.size > 0) { if (!TextUtils.isEmpty(result1[0].getOriginalValue())) { Toast.makeText(this, result1[0].getOriginalValue(), Toast.LENGTH_SHORT).show() } } } }

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

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

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

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

点击下载源码
Code copied