1. 程式人生 > >Android 基於Zxing二維碼掃描的光速實現

Android 基於Zxing二維碼掃描的光速實現

Android 十分鐘光速實現二維碼掃描

前言

在專案中要使用到二維碼的相關內容,我們第一時間想到的是使用大名鼎鼎的zxing或者ZBar開源框架:

除了這兩個有名的框架之外,還有@bingoogolapple大神的掃描庫

以及國外@dlazaro66大神的

以上是非常不錯的二維碼掃描庫,基本市場上app中的所有功能都被這些庫涵蓋了,但是個人還是覺得用他們的庫有點麻煩(不可避免的會踩到一些坑,尤其是zxing…有時掃描效率是真的低…),於是花了點時間在@dlazaro66大神的QRCodeReaderView庫做出了修改,

基於zxing的一箇中文的二維碼掃描庫

Demo示例:

二維碼掃描

該庫支援功能如下:

· 二維碼解析
· 前/後置攝像頭切換掃描
· 開啟閃光燈
· 開啟/停止二維碼掃描功能
· 自定義掃描介面UI,輕鬆定製自己的掃描框、掃描背景、掃描線相關屬性
· 獲得掃描框的座標Rect(判斷所掃二維碼是否在掃描框內等)

這些功能實現的gif圖都在github的 README 中:

和其他庫相比的優勢(個人覺得):

1.快速開發

該庫暫時只支援「二維碼掃描相關」和「二維碼介面UI的繪製」功能,因此封裝好供開發者使用的只有「QRCodeScannerView(二維碼掃描和解析)」和「QRCoverView(掃描框、掃描線等)」兩個java類,因此對於不復雜的需求,可以最快速忽略底層的原始碼,實現的二維碼解析功能。

2.自定義UI和功能更簡單

對於一般的需求,可以通過封裝好的方法進行設定,對於相對複雜的需求(比如自定義UI、掃描線等),只需要開啟對應的類,裡面的程式碼都註釋的清清楚楚,擺脫zxing龐大的程式碼量(zxing實在太強大了,但是很多功能也許用不到,學習成本更高),可以更直觀修改並實現需求:

以二維碼UI(掃描線等)介面程式碼為例:

 private final Paint laserPaint = new Paint();   //掃描線Paint
 private boolean showLaser = true;      //是否顯示掃描線
 private float laserStartH = 0
f; //掃描線初始位置 private int laserChangeBounds = 30; //漸變線的預設高度,預設30px private int laserChangeTime = 40; //UI重新整理間隔 private QRHandler handler; //掃描框的寬和高 private float scannerW; private float scannerH; //掃描框的上邊距和左邊距 private float top; private float left; //掃描邊框的長度和厚度 private float cornerH; private float cornerW; private Context context; //掃描邊框是否包裹掃描框 private boolean isCornerOutside = false; //掃描框的Rect private RectF viewFinderRect; ... ... ... //繪製背景色 public void drawScanBackground(canvas, viewFinderRect); //繪製掃描邊框 public void drawScanCorner(canvas, viewFinderRect); //繪製掃描線 public void drawLaserLine(canvas, viewFinderRect);

一、依賴和使用

1.新增到你的 Project Build.gradle:

allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
  }
}

2.新增到你的 Module Build.gradle:

dependencies {
    compile 'com.github.qingmei2:QrCodeScannerView-Android:1.1'
    compile 'com.google.zxing:core:3.2.1'
}

3.直接在你的佈局檔案xml中使用

QRCodeScannerView(二維碼掃描業務層View,主要處理Camera掃描二維碼相關邏輯)

QRCoverView(二維碼掃描UI層View,主要負責對應UI的改變,比如掃描框大小,背景顏色,掃描框邊角大小顏色等等):

 <FrameLayout
        android:id="@+id/fl_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <com.mei_husky.library.view.QRCodeScannerView
            android:id="@+id/scanner_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <com.mei_husky.library.view.QRCoverView
            android:id="@+id/cover_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

</FrameLayout>

4.在對應的Activity中的onCreate()中初始化配置:

//自動聚焦間隔2s
mScannerView.setAutofocusInterval(2000L);
//閃光燈
mScannerView.setTorchEnabled(true);
//掃描結果監聽處理
mScannerView.setOnQRCodeReadListener(new QRCodeScannerView.OnQRCodeScannerListener() {
    @Override
    public void onDecodeFinish(String text, PointF[] points) {
        Log.d("tag", "掃描結果 : " + text); 
    }
});
//相機許可權監聽
mScannerView.setOnCheckCameraPermissionListener(new QRCodeScannerView.OnCheckCameraPermissionListener() {
    @Override
    public boolean onCheckCameraPermission() {
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);
            return false;
        }
    }
});
//開啟後置攝像頭
mScannerView.setBackCamera();

二、相關API(詳細使用方法請參照Sample中程式碼)

1、QRCodeScannerView(Camera/二維碼掃描解析相關)

1.開啟二維碼掃描開關,預設開啟

setQRDecodingEnabled(boolean qrDecodingEnabled)

2.設定自動聚焦間隔,預設2s

setAutofocusInterval(long autofocusIntervalInMs);

3.二維碼解析結果回撥【需要開發者實現】

setOnQRCodeReadListener(OnQRCodeScannerListener onQRCodeScannerListener)

4.Camera許可權監聽回撥(用於Android 6.0)【需要開發者實現】

setOnCheckCameraPermissionListener(OnCheckCameraPermissionListener listener)

5.設定Camera預設開啟方向【需要開發者實現】

setFrontCamera()//前置攝像頭
setBackCamera() //後置攝像頭

6.開始/停止掃描

startCamera() 建議放在ActivityonResume()方法中
stopCamera()  建議放在ActivityonPause()方法中

7.「可選」切換前置/後置攝像頭

switchCameraFace()

2、QRCoverView(UI相關)

1.設定掃描框背景顏色

setCoverViewOutsideColor(int colorRes) 

2.設定掃描框邊角顏色

ssetCoverViewCornerColor(int colorRes)

3.設定掃描框邊角寬高

 /**
   * 設定掃描邊框寬高
   *
   * @param cornerH 掃描邊框的長度
   * @param cornerW 掃描邊框的厚度
   * @param isDp    若為true則將傳入的引數單位視為dp,false 則單位視為px
   */
  setCoverViewCorner(int cornerH, int cornerW, boolean isDp)

4.設定掃描框邊角的位置

/**
 * 若呼叫該setCoverViewConnerFace(true),則掃描邊框則會包裹掃描框顯示在介面上;
 * 否則預設掃描邊框內貼在掃描框內(大多數app預設都是該模式)
 *
 * @param isOutside
 */
setCoverViewConnerFace(boolean isOutside)

5.設定掃描框的寬高(dp)

setCoverViewScanner(int width, int height)

6.獲得掃描框的座標Rect(判斷所掃二維碼是否在掃描框內等)

RectF getViewFinderRect()

7.「重要」如果有更多需求,建議閱讀QRCoverView.java的原始碼,裡面註釋很清楚,一般的UI需求簡單改幾個成員變數的屬性就能實現,下為部分原始碼及註釋:

private final Paint laserPaint = new Paint();   //掃描線Paint
private boolean showLaser = true;      //是否顯示掃描線
private float laserStartH = 0f;        //掃描線初始位置
private int laserChangeBounds = 30;    //漸變線的預設高度,預設30px
private int laserChangeTime = 40;      //UI重新整理間隔

private QRHandler handler;

//掃描框的寬和高
private float scannerW;
private float scannerH;
//掃描框的上邊距和左邊距
private float top;
private float left;
//掃描邊框的長度和厚度
private float cornerH;
private float cornerW;
private Context context;
//掃描邊框是否包裹掃描框
private boolean isCornerOutside = false;
//掃描框的Rect
private RectF viewFinderRect;
...
...
...
@Override
protected void onDraw(Canvas canvas) {
    //預設掃描框為180dp
    if (scannerW == 0f || scannerH == 0f) {
        viewFinderRect = new RectF(left, top, left + ScannerDpUtils.dip2px(context, 180), top + ScannerDpUtils.dip2px(context, 180));
    } else {
        viewFinderRect = new RectF(left, top, left + scannerW, top + scannerH);
    }
    //繪製背景色
    drawScanBackground(canvas, viewFinderRect);
    //繪製掃描邊框
    drawScanCorner(canvas, viewFinderRect);
    //繪製掃描線
    drawLaserLine(canvas, viewFinderRect);
}

最後當然還要再開一個傳送門:

如果這個庫對你的開發有所幫助,望請不吝star,如果遇到Bug或者建議,歡迎issue,我會第一時間進行回覆,提前感謝,鞠躬!!!

相關推薦

Android 基於Zxing掃描光速實現

Android 十分鐘光速實現二維碼掃描 前言 在專案中要使用到二維碼的相關內容,我們第一時間想到的是使用大名鼎鼎的zxing或者ZBar開源框架: 除了這兩個有名的框架之外,還有@bingoogolapple大神的掃描庫 以及國外@dlaz

Android Zxing掃描圖片拉伸、掃描框過小、掃描框擴大後(或不拉伸後)閃退問題

(一)Zxing二維碼掃描框大小調整 控制掃描框大小程式碼是在CameraManager類中 google在CameraManager類中設定掃描框大小主要在getFramingRect()中: private static final int MIN_F

android 和 phonegap(Cordova)互動使用Zxing掃描

android方面的配置:配置環境,下載、編譯Zxing原始碼,整合進專案 1、環境下載、安裝,編譯Zxing原始碼 下載Zxing原始碼地址:https://github.com/zxing/zxing 其中android資料夾下為一個功能應用,有

Zxing掃描

ram zxing oss lean 預覽 surface ott serial pac 源代碼地址 有問題能夠加QQ:312122330 之前對於Zbar的二位碼掃描。到項目上線以後才發現掃描過於靈敏。導致有時候掃描到半截就啟動了。 後來翻看ZXIN

Zxing掃描的整合與優化

Zxing已經是一個很成熟的框架了,但它是用maven構建的專案,在以gradle為基礎的AS中整合起來總感覺不太方便。網上有很多種方式,我這裡主要採取了複製程式碼到自己專案中的方式,這樣有利於學習和擴充套件。 第一步:整合 官方專案地址:https://github.com

Android中Webview與原生介面互動及掃描功能實現

最近專案中有一個新的需求,大致是這樣的:APP中通過WebView展示一個第三方的HTML5介面,使用者可以在HTML5介面中呼叫Android攝像頭進行二維碼掃描,並將掃描結果顯示在HTML5介面。這顯然涉及到了Android原生與WebView之前的傳值

基於ZXing的使用幾行程式碼完成炫酷的效果

先來看效果圖怎樣,可以的話就留著用吧,開發中要的就是速度快,效果好,簡單易操作 1:在這裡寫個button按鈕用於啟動二維碼 2:這是開啟後的介面 左下角可以設定開啟燈光,右下角可以選擇相簿中的二維碼 一:喜歡的話往下看教你一步步實現,如果想把圖

android利用zbar掃描

原始碼下載 之前用zxing做開發,各種奇葩問題,橫屏修等等,而且效能也不搞。被測試批了,沒辦法後來換了zbar。效能好多了。 /*********************重要更新*******************************/ 有朋友提到兩個問題: 1.

zxing 掃描 配置和使用

二維碼掃描使用最多的主要有兩個庫:zbarSDK 和zxing 關於zbar的使用比較簡單,在這裡不多說了,對於zxing的使用就比較麻煩,雖然網上有很多關於zxing的使用方法,不過查了很多中文和英文的貼子。發現說的都不夠詳細,對與像我這樣第一次搞的新手來說差一步就錯了很

Zxing掃描的三個類(可自定義掃描框)

先新增依賴 compile 'com.journeyapps:zxing-android-embedded:3.3.0' 清單檔案配置許可權 <uses-permission android:name="android.permission.CAMERA" /&

html5掃描功能實現

html5中可以使用二維碼掃描,也可以從相簿中選擇二維碼識別,程式碼如下 var ws = null, wo = null; var scan = null, domr

iOS使用ZBar實現掃描以及實現識別相簿中圖片功能

使用zbar呼叫相機掃碼程式碼: //開啟相機 - (void) init_camera { self.navigationController.navigationBarHidden=YES;     [commonaddNavigationAddToView:

Android 基於google Zxing實現 條形碼掃描,仿微信掃描效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 基於Zxing掃描優化

最近公司專案App中要整合二維碼掃描來適應在戶外工作的時候,對碼頭集裝箱等上面貼的A4紙張列印的二維碼進行識別, 一般App二維碼整合後,能掃出來就不管了,但是我們在整合成功後,根據使用者反饋,在戶外的環境下,很多二維碼識別不了,或者識別速度慢,我們自己也是適用了一下,發現也確實是這樣. &nb

Android 基於google Zxing實現、條形碼掃描,仿微信掃描效果(現在正做個掃描App、收藏)

瞭解二維碼這個東西還是從微信中,當時微信推出二維碼掃描功能,自己感覺挺新穎的,從一張圖片中掃一下竟然能直接加好友,不可思議啊,那時候還不瞭解二維碼,呵呵,然後做專案的時候,老闆說要加上二維碼掃描功能,然後自己的屁顛屁顛的去百度,google啥的,發現很多朋友都

Android 基於zxing掃描功能的簡單實現及優化

由於專案中需要接入一下簡單的二維碼掃描功能,最終使用 zxing 來實現,把官方例子中的部分程式碼摘除出來做了簡單的封裝,並進行了一些優化。這裡簡單做一個記錄。 掃描二維碼 Android 中關於二維碼掃描的庫有很多,但是歸根到底無外乎下面這幾種

高仿仿微信介面掃描效果 之 Android 基於google Zxing實現、條形碼掃描

    絕大多數android開發者都是使用google Zxing來實現二維碼、條形碼掃描,但官方和網上很多demo的掃描介面讓人不忍直視,今天我也做了一個,介面和執行效都是高仿微信最新版的掃描效果,執行效果圖如下: 主要是修改了ViewfindView類,我就不多解

Android項目實戰(四十四):Zxing切換橫屏掃描

pla xxx mage tde min bar 分享圖片 spl 發現 原文:Android項目實戰(四十四):Zxing二維碼切換橫屏掃描Demo鏈接 默認是豎屏掃描,但是當我們在清單文件中配置橫屏顯示的時候: <activity

基於Zxing掃描之橫屏掃描

ews name pla eight 網上 HA 如果 log 簡單的 最近項目條碼掃描要改為橫屏,網上所搜了一下,然後發現我寫的需要改動幾行代碼就可以了,還是很給力的。 如未查看之前的代碼,請移步: 基於Zxing的二維碼生成和二維碼掃描 修改下面寫代碼就可以實現橫

Android 開發功能實現(四)------基於Zxing實現編碼功能(生成,一等)

Android 二維碼開發功能實現(四)------基於Zxing實現編碼功能(生成二維碼,一維碼等) 前言 關於Google的開源庫Zxing,前面也寫了幾遍文章進行介紹.我們先簡單的回顧一下! Android 二維碼的掃碼功能實現(一) 這篇文章主要介紹了,Zxi