华为统一扫码服务(Scan Kit)提供便捷的条形码和二维码扫描、解析、生成能力,帮助您快速构建应用内的扫码功能。
得益于华为在计算机视觉领域能力的积累,Scan Kit可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,提升扫码成功率与用户体验。
在这个Codelab中,你将创建一个使用Bitmap Mode的扫码App。
若您需要正式发布集成Scan Kit的应用,请参考《HUAWEI HMS Core 集成准备》中详细说明来完成接入准备。
若您使用本Codelab Demo验证时,直接使用Sample Code中的设置,可以跳过此步骤。
针对Android Studio开发环境,华为提供了Maven仓集成方式的HMS Core SDK包。在开始开发前,您需要将HMS Core SDK集成到您的Android Studio开发环境中。
如果在AppGallery Connect中开通了相关服务则需要将"agconnect-services.json"文件添加到您的App中
1. 打开Android Studio项目级"build.gradle"文件。
2. 添加HUAWEI agcp插件以及Maven代码库。
buildscript {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
...
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}
1. 打开应用级的"build.gradle"文件。
2. 在"dependencies"中添加如下编译依赖,{version}需要替换为实际的SDK版本号,版本号索引请参见版本更新说明。如当前版本:implementation 'com.huawei.hms:scan:1.3.1.300'。
dependencies {
implementation 'com.huawei.hms:scan:{version}'
}
3. 添加AGC插件配置。
Android Studio 4.0之前版本,在文件头apply plugin: 'com.android.application'下一行添加如下配置。
apply plugin: 'com.huawei.agconnect'
Android Studio 4.0及之后版本,在“plugins”中添加如下配置。
plugins {
...
id 'com.huawei.agconnect'
}
4. 同步工程。在完成以上的配置后,点击工具栏中的gradle同步图标,完成"build.gradle"文件的同步,将相关依赖下载到本地。
1. 在调用Scan Kit时,开发者需要先在Manifest中声明相应的权限。
在AndroidManifest.xml文件中,增加:
<!—读文件权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. 声明权限后,还需要在代码中动态申请一下权限。在MainActivity.java
中,增加:
Java示例代码:
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示例代码:
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<out String>, grantResults:IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (permissions == null || grantResults == null || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
return
}
if (requestCode == MainActivity.BITMAP) {
// Call the system album.
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) {
//receive result after your activity finished scanning
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?) {
//receive result after your activity finished scanning
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.length > 0) {
if (!TextUtils.isEmpty(result1[0].getOriginalValue())) {
Toast.makeText(this, result1[0].getOriginalValue(), Toast.LENGTH_SHORT).show()
}
}
}
}
完成开发后,点击开发界面上的运行图标,运行Android Studio工程打包生成APK,并安装在测试手机上。
首次进入应用时的界面:
点击 Bitmap Mode:
扫码后返回结果:
干得好,你已经成功完成了Codelab并学到了:
如需了解更多与华为Scan Kit相关的信息,请关注我们的官方网站。开发过程中如果遇见问题,请参见我们的常见问题解答。
您可以阅读下面链接,了解更多相关的信息。
点击下方按钮下载源码。