二維碼污損、反光、距離遠還能掃出來嗎?統一掃碼服務告訴你,能!

来源:https://www.cnblogs.com/hmscore/archive/2022/05/27/16316302.html
-Advertisement-
Play Games

二維碼和條形碼從發明到發展已經過去了幾十年,因其能快捷方便讀取信息的特點,在數字經濟時代被廣泛應用。掃描二維碼可以識別健康狀況,識別身份信息、訪問網站鏈接、完成金融支付等等,已經成為生活中不可或缺的實用技術,所以很多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為例,展示具體的集成步驟。

開發前準備

  1. 在項目級”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' 
 }
  1. 配置混淆腳本
-ignorewarnings 
-keepattributes *Annotation*  
-keepattributes Exceptions  
-keepattributes InnerClasses  
-keepattributes Signature  
-keepattributes SourceFile,LineNumberTable  
-keep class com.hianalytics.android.**{*;}  
-keep class com.huawei.**{*;}
  1. 在“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);
  1. 校驗是否開啟相應的許可權,決定是否繼續掃碼。
// 實現“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) {
        // 調用掃碼介面,構建掃碼能力。
        ...
    }
}

構建掃碼功能

  1. 根據實際需求創建掃碼選項參數。
// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”表示只掃描QR和Data Matrix的碼
HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).create();
  1. 調用ScanUtil的靜態方法startScan啟動Default View掃碼頁面。用戶可以使用相機掃碼,也可以通過該頁面的“導入圖片”按鈕檢測圖片中的碼。
ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, options);
  1. 實現回調介面接收掃碼結果,相機掃碼和導入圖片掃碼均通過該介面返回。
@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);
         }
    }
}

瞭解更多詳情>>

訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 掌握$I^2C$的通訊方法和時序,通過串口發送數據,單片機接收並存入AT24C02首地址中。按下按鍵BTN,單片 ...
  • 思路: 1、socket 建立一個數據報套接字。 2、定義一個struct ifreq ifr 結構體。將網路名稱如“eth0” 賦值給ifr結構體的ifr.ifr_name。 3、調用ioctl(sockfd, SIOCGIFFLAGS, &ifr) 獲取網路標識。 如需設置網路標識,更改ifr結 ...
  • teacher表: iddeptnamephonemobile 101 1 Shrivell 2753 07986 555 1234 102 1 Throd 2754 07122 555 1920 103 1 Splint 2293 104 Spiregrain 3287 105 2 Cutflow ...
  • 本文介紹如何使用 SELECT 語句查詢 SQL 如何對錶進行創建、更新和刪除操作 中創建的 Product 表中數據。這裡使用的 SELECT 語句是 SQL 最基本也是最重要的語句。 請大家在實際運行本文中的 SELECT 語句時,親身體驗一下其書寫方法和執行結果。 執行查詢操作時可以指定想要查 ...
  • 1 Hadoop介紹 Hadoop是Apache旗下的一個用java語言實現開源軟體框架,是一個開發和運行處理大規模數據的軟體平臺。允許使用簡單的編程模型在大量電腦集群上對大型數據集進行分散式處理。狹義上說,Hadoop指Apache這款開源框架,它的核心組件有: HDFS(分散式文件系統):解決 ...
  • 最近在數據處理中用到了窗函數, 把使用方法記錄一下, 暫時只有分組排序和滑動時間視窗的例子, 以後再逐步添加. 在SQL查詢時, 會遇到有兩類需要分組統計的場景, 在之前的SQL語法中是不方便實現的. 使用窗函數直接SQL中使用窗函數就能解決這些問題, 否則需要使用臨時表, 函數或存儲過程進行處理.... ...
  • 本文介紹如何使用 CREATE DATABASE 語句創建資料庫、 CREATE TABLE 語句創建表、ALTER TABLE 語句更新表、DROP TABLE 語句刪除表。 一、表的創建 本節要點 表通過 CREATE TABLE 語句創建而成。 表和列的命名要使用有意義的文字。 指定列的數據類 ...
  • 5月24日,由華為開發者聯盟主辦的HUAWEI Developer Day(華為開發者日,簡稱HDD)線上沙龍·創新開發專場在華為開發者學堂及各大直播平臺與廣大開發者見面。直播內容主要聚焦HarmonyOS和HMS生態應用開發,帶來關於HarmonyOS服務卡片、HMS Core開放能力、應用高效開 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...