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() 建議放在Activity的onResume()方法中
stopCamera() 建議放在Activity的onPause()方法中
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