1. 程式人生 > 其它 >Android 掃描二維碼(Scan Kit)

Android 掃描二維碼(Scan Kit)

華為統一掃碼服務(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);
       }
   }
}
      轉自https://www.codenong.com/cs106692912/