二維碼和條形碼從發明到發展已經過去了幾十年,因其能快捷方便讀取信息的特點,在數字經濟時代被廣泛應用。掃描二維碼可以識別健康狀況,識別身份信息、訪問網站鏈接、完成金融支付等等,已經成為生活中不可或缺的實用技術,所以很多App都搭載了“掃一掃”功能。 然而,在日常掃碼過程中,我們也經常會遇到掃碼環境暗、 ...
二維碼和條形碼從發明到發展已經過去了幾十年,因其能快捷方便讀取信息的特點,在數字經濟時代被廣泛應用。掃描二維碼可以識別健康狀況,識別身份信息、訪問網站鏈接、完成金融支付等等,已經成為生活中不可或缺的實用技術,所以很多App都搭載了“掃一掃”功能。
然而,在日常掃碼過程中,我們也經常會遇到掃碼環境暗、二維碼污損、模糊等情況,導致識別二維碼困難。HMS Core 統一掃碼服務(Scan Kit)為常見覆雜掃碼場景(如反光、暗光、污損、模糊、柱面)做了針對性識別優化,還能實現遠距離碼或小型碼的檢測和自動放大,提升掃碼成功率與用戶體驗。
1. 遠距離掃碼
普通的二維碼掃描器只讀距離不超過30釐米,然而我們生活中經常出現遠距離掃碼的情況,例如停車場遠距離掃碼繳費、公眾場合掃碼簽到等,普通的掃碼服務在這時候就會出現掃碼困難的情況。統一掃碼服務,由於在掃碼處理流程中多了一個預檢測的功能,即使是肉眼無法分辨,也可以很好的自動放大超遠距離的二維碼。
2. 二維碼污損
二維碼污損也是戶在日常掃碼中經常遇到的情況,比如掃碼騎行時遇到二維碼破損,掃描紙質二維碼因為紙張破損二維碼不完整的情況也常有出現,統一掃碼服務基於多項電腦視覺技術,可以大幅提升複雜場景識別率。
當然,HMS Core 統一掃碼服務除了支持污損二維碼掃描,遇到反光,暗光等場景,甚至將二維碼貼在商品上時出現曲面或棱角的情況,也能成功掃碼;哪怕你邊走動邊掃碼,此時的二維碼模糊不清也不影響掃碼的準確率。
3. 多碼識別
在倉庫清點、收發貨物時,常常遇到擺滿了貨物,上面都貼上條形碼的情況,如果工人一個個掃碼清點,效率非常低。多碼識別可以幫助倉庫清點,快遞收發等場景實現一次識別多個碼,提升業務處理效率。多碼識別模式下,Scan Kit一次最多可以同時識別不限種類的5個碼。
4. 多角度掃碼
有時由於環境的限制,我們不一定能掃到正面角度的二維碼, 統一掃碼服務基於自動檢測及旋轉糾正能力,識別區域更寬(側面和側面+45°),支持用戶從任意角度掃碼,可自動校正快速識別二維碼,即使位置不方便也能正確識別,從而提升應用掃碼靈活度和識別率。
開發步驟
統一掃碼服務提供多元的接入方式,最少5行代碼即可擁有強大的掃碼能力,開發者可以直接使用Scan Kit提供的預設掃碼頁面,也可以基於Scan Kit提供的示例代碼,快速自定義掃碼功能。以下我會以Default View Mode為例,展示具體的集成步驟。
開發前準備
- 在項目級”setting.gradle”中配置HMS Core maven倉地址
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
// 配置HMS Core SDK的Maven倉地址。
maven { url 'https://developer.huawei.com/repo/' }
}
}
dependencyResolutionManagement {
...
repositories {
google()
mavenCentral()
// 配置HMS Core SDK的Maven倉地址。
maven { url 'https://developer.huawei.com/repo/' }
}
}
2.在應用級的build.gradle上添加編譯依賴
dependencies{
implementation 'com.huawei.hms:scanplus:2.4.0.302'
}
- 配置混淆腳本
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.**{*;}
- 在“AndroidManifest.xml”中指定相機許可權和文件讀取許可權,並動態申請許可權
<!--相機許可權-->
<uses-permission android:name="android.permission.CAMERA" />
<!--讀文件許可權-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
// CAMERA_REQ_CODE為用戶自定義,用於接收許可權校驗結果的請求碼。
this.requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_REQ_CODE);
- 校驗是否開啟相應的許可權,決定是否繼續掃碼。
// 實現“onRequestPermissionsResult”函數接收校驗許可權結果。
final int PERMISSIONS_LENGTH = 2;
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 判斷“requestCode”是否為申請許可權時設置請求碼CAMERA_REQ_CODE,然後校驗許可權開啟狀態。
if (requestCode == CAMERA_REQ_CODE && grantResults.length == PERMISSIONS_LENGTH && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// 調用掃碼介面,構建掃碼能力。
...
}
}
構建掃碼功能
- 根據實際需求創建掃碼選項參數。
// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只掃描QR和Data Matrix的碼
HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).create();
- 調用ScanUtil的靜態方法startScan啟動Default View掃碼頁面。用戶可以使用相機掃碼,也可以通過該頁面的“導入圖片”按鈕檢測圖片中的碼。
ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, options);
- 實現回調介面接收掃碼結果,相機掃碼和導入圖片掃碼均通過該介面返回。
@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_SCAN_ONE) {
// 導入圖片掃描返回結果
HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);
if (obj != null) {
// 展示解碼結果
showResult(obj);
}
}
}
瞭解更多詳情>>
訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHub、Gitee
關註我們,第一時間瞭解 HMS Core 最新技術資訊~