Android 掃描二維碼(Scan Kit)
阿新 • • 發佈:2022-12-12
華為統一掃碼服務(Scan Kit)能夠提供專業的二維碼與條形碼掃描與解析能力,通過整合Scan Kit,幫助應用快速構建掃碼功能。
統一掃碼服務的功能
全面的碼識別能力:Scan Kit支援全球主流的13種碼制式識別。官方表示,Scan Kit幾乎覆蓋了日常生活中可見的各種二維碼和條形碼,識別成功率超過96%。
遠距離檢測與自動放大:Scan Kit可通過自動檢測遠距離碼和小型碼並進行自動放大,提高使用者的應用掃碼成功率。
任意角度識別:Scan Kit基於自動檢測及旋轉糾正能力,支援使用者從任意角度掃碼,提升應用掃碼靈活度和識別率。
複雜場景識別增強:Scan Kit基於多項計算機視覺技術(CV),能夠在低光照、反光、變形、模糊、汙損、彩色及特殊形態碼、多碼並存等各種疑難場景中進行識別增強。
場景化的碼內容分析能力:Scan Kit還具備碼內容分析能力。在掃描時同步提取碼的結構化資訊和適用場景,幫助APP快速為使用者提供相應的服務,包括連線Wi-Fi、新增聯絡人、新增日程、查詢位置等,覆蓋多達12種生活化場景。
接入華為統一掃碼服務
華為表示,開發者可以根據需要選擇4種不同的接入模式,其中Default view mode,最少只需要5行程式碼,即可實現快速整合。同時,碼識別和解析的過程全部在端側完成,不儲存掃描後的碼資訊,確保使用者隱私安全。
具體內容參考華為掃碼服務開發指南
使用
在專案級gradle裡新增華為maven倉
1 2 3 4 5 6 7 8 9 10 |
buildscript { repositories { maven {url 'http://developer.huawei.com/repo/'} } } allprojects { repositories { maven { url 'http://developer.huawei.com/repo/'} } } |
在應用級的build.gradle裡面加上SDK依賴
增量新增SDK依賴,SDK他們有兩種版本,plus和普通版,plus效果好點兒但是包稍微大一點兒,這個地方我選了plus版本,可以根據自己需要自行選擇,版本號填他們最新的版本就好。
1 2 3 |
dependencies{ implementation 'com.huawei.hms:scanplus:1.1.1.301' } |
加混淆配置
複製貼上華為官網上給的混淆程式碼就可以了
1 2 3 4 5 6 7 8 |
-ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.**{*;} -keep class com.huawei.**{*;} |
Manifest申請靜態許可權和掃碼頁面宣告
申請靜態許可權和使用特性
1 2 3 4 5 6 7 |
<!--相機許可權--> <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" /> |
在application標籤內新增對掃碼頁面的宣告
1 2 |
<!--對掃碼頁面進行宣告--> <activity android:name="com.huawei.hms.hmsscankit.ScanKitActivity" /> |
程式碼開發
動態申請許可權
1 2 3 4 5 6 7 8 9 10 |
public void loadScanKitBtnClick(View view) { requestPermission(CAMERA_REQ_CODE, DECODE); } private void requestPermission(int requestCode, int mode) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, requestCode); } |
在許可權申請回調中啟動掃碼介面
1 2 3 4 5 6 7 8 9 10 11 12 |
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (permissions == null || grantResults == null) { return; } 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().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE).create()); } } |
在activity回撥裡面獲取碼結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@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) { this.textView.setText(obj.originalValue); } } } ParcelableExtra(ScanUtil.RESULT); if (obj != null) { this.textView.setText(obj.originalValue); } } } |