# ScanKitDemo
**Repository Path**: luoli-android/scan-kit-demo
## Basic Information
- **Project Name**: ScanKitDemo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-03-19
- **Last Updated**: 2022-07-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Scan Kit 华为统一扫码服务的使用介绍
### 简介
>华为统一扫码服务(Scan Kit)提供便捷的条形码和二维码扫描、解析、生成能力,帮助您快速构建应用内的扫码功能。
.
### 优点
>Scan Kit可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,提升扫码成功率与用户体验。
.
### 支持的码制式
>Scan Kit支持扫描13种全球主流的码制式。如果您的应用只处理部分特定的码制式,您也可以在接口中指定制式以便加快扫码速度。已支持的码制式:
>>- **一维码:** `EAN-8`、`EAN-13`、`UPC-A`、`UPC-E`、`Codabar`、`Code 39`、`Code 93`、`Code 128`、`ITF`
>
>>- **二维码:** `QR Code`、`Data Matrix`、`PDF417`、`Aztec`
.
### Scan Kit的4种调用模式
>- **Default View Mode模式**
>> 在该模式下,扫码流程是由Scan Kit提供并进行处理的,并且Scan Kit也提供扫码界面,开发者不用做任何处理就可以直接使用扫码功能。在此模式下可以实现 相机扫码 和 导入图片扫码等功能。
>
>- **Customized View Mode模式**
>> 在该模式下,扫码流程是由Scan Kit提供并进行处理的,但是扫码界面需要开发者自定义,可以通过自定义扫码界面,来满足不同的项目需求。
>
>- **Bitmap Mode模式**
>> 在该模式下,扫码流程和扫码界面都需要开发者自己来处理扫码的流程和自定义扫码界面,在此模式下开发者拥有更加大的自定义空间,可以执行特定的扫码流程。
>
>- **MultiProcessor Mode模式**
>> 在该模式下,扫码流程和扫码界面都需要开发者自己来处理扫码的流程和自定义扫码界面,在此模式下开发者可以实现 同时检测多个码,或者与`ML Kit`匹配实现同时识别码和人脸等其他对象
.
### 码值的解析结果
>Scan Kit可以将码的原始内容返回给开发者,还会针对使用特定内容格式编码的二维码/条码进行分析并提取结构化数据,帮助开发者快速构建关联服务。
>
> **支持场景:**
>>联系人信息、Wi-Fi连接信息、网页、日历日程、ID卡、短信、电话、邮件、地理位置、商品条码、ISBN。
.
### Scan Kit也支持生成码
> Scan Kit支持将字符串转换为一维码或二维码,目前已支持的码制式为`EAN-8`、`EAN-13`、`UPC-A`、`UPC-E`、`Codabar`、`Code 39`、`Code 93`、`Code 128`、`ITF`、`QR Code`、`Data Matrix`、`PDF417、Aztec`。开发者只需要提供字符串、码制式和尺寸要求即可获得相应的码图。
.
.
### Scan Kit的简单使用
**1. 在全局`build.gradle`文件里添加华为maven仓库**
buildscript {
repositories {
maven {url 'http://developer.huawei.com/repo/'}
}
}
allprojects {
repositories {
maven { url 'http://developer.huawei.com/repo/'}
}
}
**2. 在build.gradle文件里添加Scan Kit的依赖**
apply plugin: 'com.huawei.agconnect'
...
dependencies{
//Scan Kit的依赖
//plus版
implementation 'com.huawei.hms:scanplus:1.1.1.301'
//普通版
implementation 'com.huawei.hms:scan:1.1.3.301'
}
> **注:**
> Scan Kit的SDK有两种版本,普通版和plus版,plus版效果好点儿但是包稍微大一点儿,支持增强识别模型。
**3. 在`proguard-rules.pro`文件里配置混淆脚本**
如果开发者开启混淆配置,请按照如下步骤配置,避免HMS SDK相关代码被混淆导致功能异常。
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.**{*;}
**AndResGuard下的配置:**
"R.string.hms*",
"R.string.connect_server_fail_prompt_toast",
"R.string.getting_message_fail_prompt_toast",
"R.string.no_available_network_prompt_toast",
"R.string.third_app_*",
"R.string.upsdk_*",
"R.layout.hms*",
"R.layout.upsdk_*",
"R.drawable.upsdk*",
"R.color.upsdk*",
"R.dimen.upsdk*",
"R.style.upsdk*",
"R.string.agc*"
**4. 在 `AndroidManifest.xml` 文件中添加相应的权限**
在application标签内添加对扫码页面的声明
**5. 动态申请权限**
private void requestPermission(int requestCode, int mode) {
if (mode == DECODE) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},
requestCode);
} else if (mode == GENERATE) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
requestCode);
}
}
**6. 启动扫码页面**
@Override
//授权结果处理的方法
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (permissions == null || grantResults == null) {
return;
}
//生成二维码的页面
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == GENERATE_CODE) {
Intent intent = new Intent(this, GenerateCodeActivity.class);
this.startActivity(intent);
}
if (grantResults.length < 2 || grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
return;
}
//默认扫码界面
if (requestCode == CAMERA_REQ_CODE) {
ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, new HmsScanAnalyzerOptions.Creator().create());
}
//自定义扫码界面
if (requestCode == DEFINED_CODE) {
Intent intent = new Intent(this, DefinedActivity.class);
this.startActivityForResult(intent, REQUEST_CODE_DEFINE);
}
//Bitmap调用方式
if (requestCode == BITMAP_CODE) {
Intent intent = new Intent(this, CommonActivity.class);
intent.putExtra(DECODE_MODE, BITMAP_CODE);
this.startActivityForResult(intent, REQUEST_CODE_SCAN_MULTI);
}
//MultiprocessorAPI同步调用方式
if (requestCode == MULTIPROCESSOR_SYN_CODE) {
Intent intent = new Intent(this, CommonActivity.class);
intent.putExtra(DECODE_MODE, MULTIPROCESSOR_SYN_CODE);
this.startActivityForResult(intent, REQUEST_CODE_SCAN_MULTI);
}
//MultiprocessorAPI异步调用方式
if (requestCode == MULTIPROCESSOR_ASYN_CODE) {
Intent intent = new Intent(this, CommonActivity.class);
intent.putExtra(DECODE_MODE, MULTIPROCESSOR_ASYN_CODE);
this.startActivityForResult(intent, REQUEST_CODE_SCAN_MULTI);
}
}
**7. 接收扫码返回的结果**
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
//Intent的结果回调的方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK || data == null) {
return;
}
//Default View
if (requestCode == REQUEST_CODE_SCAN_ONE) {
//扫码返回的数据(码格式,扫码类型,扫码内容)
HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);
/**
* obj.getOriginalValue();//扫码的结果
* obj.getScanType();//二维码的格式
* obj.getScanTypeForm();//二维码内容的类型
* */
if (obj != null) {
Intent intent = new Intent(this, DisPlayActivity.class);
intent.putExtra(RESULT, obj);
startActivity(intent);
}
} else
//MultiProcessor & Bitmap
if (requestCode == REQUEST_CODE_SCAN_MULTI) {
Parcelable[] obj = data.getParcelableArrayExtra(CommonActivity.SCAN_RESULT);
if (obj != null && obj.length > 0) {
//Get one result.
if (obj.length == 1) {
if (obj[0] != null && !TextUtils.isEmpty(((HmsScan) obj[0]).getOriginalValue())) {
Intent intent = new Intent(this, DisPlayActivity.class);
intent.putExtra(RESULT, obj[0]);
startActivity(intent);
}
} else {
Intent intent = new Intent(this, DisPlayMulActivity.class);
intent.putExtra(RESULT, obj);
startActivity(intent);
}
}
} else
//Customized View
if (requestCode == REQUEST_CODE_DEFINE) {
HmsScan obj = data.getParcelableExtra(DefinedActivity.SCAN_RESULT);
if (obj != null) {
Intent intent = new Intent(this, DisPlayActivity.class);
intent.putExtra(RESULT, obj);
startActivity(intent);
}
}
}
到这里Scankit的简单使用就介绍完毕了,更多的高级使用请阅读 [**华为扫码服务开发指南**](https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/scan-introduction-4)
.
.
### 参考资料
- [**华为扫码服务开发指南**](https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/scan-introduction-4)