免彈窗、預授權,預設介面掃碼能力打造系統級掃碼體驗

HarmonyOS_SDK發表於2024-09-18

二維碼如今是移動應用流量入口以及功能實現的重要工具,也是各App的流量入口,使用場景愈加豐富,廣泛應用於支付、出行、餐飲、生活服務、智慧生活、零售及廣告營銷等主流場景。

然而,在實際生活中,掃碼環境如光照強度、掃碼角度、距離等,相機功能如縮放、對焦、曝光等和碼圖本身完整程度、彎曲程度等很大程度上會影響使用者的掃碼體驗。

HarmonyOS SDK 統一掃碼服務(Scan Kit)作為軟硬協同的系統級掃碼服務,幫助開發者的應用快速構建面向各種場景的碼圖識別和生成能力。統一掃碼服務應用了多項計算機視覺技術和AI演算法技術,不僅實現了遠距離自動掃碼,同時還針對多種複雜掃碼場景(如暗光、汙損、模糊、小角度、曲面碼等)做了識別最佳化,實現遠距離碼或小型碼的檢測和自動放大,提升掃碼成功率與使用者體驗。

image

image

其中統一掃碼服務的預設介面掃碼能力提供系統級體驗一致的掃碼介面,包含相機預覽流,相簿掃碼入口,暗光環境閃光燈開啟提示,支援單碼和多碼識別,具備相機預授權,呼叫介面時,無需開發者再次申請相機許可權。適用於不同掃碼場景的應用開發。

能力優勢

接入簡單:一行程式碼,接入簡單;系統級介面,包體0增加。

免彈窗:系統相機許可權預授權,保護使用者資訊保安。

識別率高:應用多項CV技術,提升掃碼成功率和速度。

識別距離遠:應用端側AI演算法技術,實現遠距離識碼。

業務流程

image

開發步驟

統一掃碼服務提供了預設介面掃碼的能力,由掃碼介面直接控制相機實現最優的相機放大控制、自適應的曝光調節、自適應對焦調節等操作,保障流暢的掃碼體驗,減少開發者的工作量。

以下示例為呼叫Scan Kit的startScanForResult介面跳轉掃碼頁面。

1.匯入預設介面掃碼模組,scanCore提供掃碼型別定義,scanBarcode提供拉起預設介面掃碼的方法和引數,匯入方法如下。

import { scanCore, scanBarcode } from '@kit.ScanKit';
// 匯入預設介面需要的日誌模組和錯誤碼模組
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

2.呼叫startScanForResult方法拉起預設掃碼介面。

透過Promise方式得到掃碼結果。

[@Entry](https://my.oschina.net/u/4127701)
[@Component](https://my.oschina.net/u/3907912)
struct ScanBarCodePage {
  build() {
    Column() {
      Row() {
        Button("Promise with options")
          .backgroundColor('#0D9FFB')
          .fontSize(20)
          .fontColor('#FFFFFF')
          .fontWeight(FontWeight.Normal)
          .align(Alignment.Center)
          .type(ButtonType.Capsule)
          .width('90%')
          .height(40)
          .margin({ top: 5, bottom: 5 })
          .onClick(() => {
            // 定義掃碼引數options
            let options: scanBarcode.ScanOptions = {
              scanTypes: [scanCore.ScanType.ALL],
              enableMultiMode: true,
              enableAlbum: true
            };
            // 可呼叫getContext介面獲取當前頁面關聯的UIAbilityContext
            scanBarcode.startScanForResult(getContext(this), options).then((result: scanBarcode.ScanResult) => {
              // 收到掃碼結果後返回
              hilog.info(0x0001, '[Scan CPSample]', `Succeeded in getting ScanResult by promise with options, result is ${JSON.stringify(result)}`);
            }).catch((error: BusinessError) => {
              hilog.error(0x0001, '[Scan CPSample]',
                `Failed to get ScanResult by promise with options. Code:${error.code}, message: ${error.message}`);
            });
          })
      }
      .height('100%')
    }
    .width('100%')
  }
}

透過Callback回撥函式得到掃碼結果。

@Entry
@Component
struct ScanBarCodePage {
  build() {
    Column() {
      Row() {
        Button('Callback with options')
          .backgroundColor('#0D9FFB')
          .fontSize(20)
          .fontColor('#FFFFFF')
          .fontWeight(FontWeight.Normal)
          .align(Alignment.Center)
          .type(ButtonType.Capsule)
          .width('90%')
          .height(40)
          .margin({ top: 5, bottom: 5 })
          .onClick(() => {
            // 定義掃碼引數options
            let options: scanBarcode.ScanOptions = {
              scanTypes: [scanCore.ScanType.ALL],
              enableMultiMode: true,
              enableAlbum: true
            };
            // 可呼叫getContext介面獲取當前頁面關聯的UIAbilityContext
            scanBarcode.startScanForResult(getContext(this), options,
              (error: BusinessError, result: scanBarcode.ScanResult) => {
                if (error) {
                  hilog.error(0x0001, '[Scan CPSample]',
                    `Failed to get ScanResult by callback with options. Code: ${error.code}, message: ${error.message}`);
                  return;
                }
                // 收到掃碼結果後返回
                hilog.info(0x0001, '[Scan CPSample]', `Succeeded in getting ScanResult by callback with options, result is ${JSON.stringify(result)}`);
              })
          })
      }
      .height('100%')
    }
    .width('100%')
  }
}

瞭解更多詳情>>

訪問統一掃碼服務聯盟官網

獲取預設介面掃碼服務開發指導文件

相關文章