1. 程式人生 > >android超好用基於zxing全屏掃碼【詳細步驟】(一)

android超好用基於zxing全屏掃碼【詳細步驟】(一)

公司有個專案是這樣的:要求掃條形碼能識別上面的數字。於是選用了zxing進行掃碼,可一定要吐槽的是:太慢了,一個條形碼要掃5-10秒才能識別。於是換用了zbar進行掃碼。
zbar的速度很快,秒掃,但後面發現一個嚴重的問題,太不準了!不準到一個條形碼我能掃到好多種結果出來。例如下圖:
這裡寫圖片描述
這個圖使用zbar我掃到3-5種不同的結果出來,當然,也有個辦法能防止zbar掃出錯誤的結果:
改一下CaptureActivity的PreviewCallback:

PreviewCallback previewCb = new PreviewCallback() {
        public
void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters parameters = camera.getParameters(); Size size = parameters.getPreviewSize(); Image barcode = new Image(size.width, size.height, "Y800"); barcode.setData(data); int result = scanner.scanImage(barcode); if
(result != 0) { previewing = false; mCamera.setPreviewCallback(null); mCamera.stopPreview(); SymbolSet syms = scanner.getResults(); Symbol bestSym = null; for (Symbol sym : syms) { if(bestSym == null
|| bestSym.getQuality()< sym.getQuality()){ bestSym = sym; } } if(bestSym == null) return; int quality = bestSym.getQuality(); Intent intent = new Intent(); intent.putExtra("BarCode", quality>2?bestSym.getData():""); intent.putExtra("hasBarCode", quality>2); setResult(RESULT_OK, intent); finish(); } } };

這裡如果quality<2就算掃碼失敗,進行相應處理,可無語的是仍然不準。。。。

於是我問老大能用zxing嗎?老大吐槽說:zxing掃條形碼太慢了。。。於是我抓耳撓腮,想著解決問題的辦法。
想到了如下方法:

1.找個新的掃碼框架處理
2.改進zbar,讓它識別率變高
3.改進zxing,讓它識別速度變快

1.找個新的掃碼框架

結果是失敗了,沒有合適的掃碼框架,所有掃碼都是在zbar或zxing基礎上進行改進的,所以這條跳過

2和3

想了一下2一定是整個演算法都要改了,可能要改c程式碼,這方面勉強看的懂比較弱,估計耗時會很久,於是還是選3.找到了http://blog.csdn.net/f820306455/article/details/54137182這篇文章,給了比較大的啟發,影象演算法什麼的完全不會,但把握會的地方改了一下,基本秒掃。下面講一下改造步驟。

改造步驟

1.刪除bundle傳bitmap的部分直接改為全屏識別

a.全屏掃樣式更改
CameraManager.java
需要更改buildLuminanceSource()方法:

 public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
    return new PlanarYUVLuminanceSource(data, width, height, 0, 0,
            width, height);
            }

但單單這樣改不行,會無法識別,需要去除外部的遮蓋框,直接用全屏掃碼:
ViewfinderView.java
需要更改onDraw():

public void onDraw(Canvas canvas) {
    postInvalidateDelayed(ANIMATION_DELAY, 0, 0,
                getWidth(), getHeight());
}

b.去掉傳遞圖片(一般只需要掃碼的條碼號或者網址,掃碼圖片本身我們不關心,如果需要這部分需要對這個圖片進行壓縮處理,不然會出錯)

MipActivityCapture.java
這裡需要刪掉handleDecode裡面的bundle.putParcelable("bitmap", barcode);,barcode這個引數也可以不用傳遞了。
相應的在CaptureActivityHandler.java的handleMessage中只需要傳遞msg.obj,下面這句可以刪掉:

 Bitmap barcode = bundle == null ? null :
            (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);

然後把DecodeHandler.java的decode()方法也改一下:
刪掉下面的部分

   Bundle bundle = new Bundle();
      bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
      message.setData(bundle);

2.增加自動對焦的速度

AutoFocusCallback.java的AUTOFOCUS_INTERVAL_MS的值改為500L【如果調整了相機形變建議1000L-1500L】,這個值不能過小,不然掃碼還沒掃全對焦已經結束了。會導致掃碼結果不準

3.相機放大比例改為最高的1/10

修改CameraConfigurationManager的setDesiredCameraParameters():
去掉setZoom(parameters);改為:
這個是指相機倍數,建議1/5-1/10,1/5識別速度更快,1/10的視野更舒服
1/10:
1/10視野
1/5:
這裡寫圖片描述
拍攝距離大概在25釐米左右

parameters.setZoom(parameters.getMaxZoom() / 10);

補充:然後還是不滿意,因為相機變形了。。。各種網上的例子試過了,修正了形變就是掃不出來,鬱悶。

後面無意按照:http://blog.csdn.net/qq_1991/article/details/53586408的第二點改了(第一點不要改無用且掃碼失效),解決。實測發現這樣會導致識別率降低,識別速度變慢,而且出現一定的錯誤機率。尤其是條形碼很長的時候,以前秒掃的,現在難以識別了,請開發的各位考慮

防止連結失效,這裡貼一下:
找到CameraConfigurationManager類的setDesiredCameraParameters(Camera camera)方法,將其中的程式碼註釋,然後新增如下程式碼:

Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
int position = 0;
if(supportedPreviewSizes.size() > 2){
    position = supportedPreviewSizes.size() / 2 + 1;// supportedPreviewSizes.get();
}else {
    position = supportedPreviewSizes.size() / 2;
}

int width = supportedPreviewSizes.get(position).width;
int height = supportedPreviewSizes.get(position).height;
camera.setDisplayOrientation(90);
cameraResolution.x = width;
cameraResolution.y = height;
parameters.setPreviewSize(width, height);
setFlash(parameters);
setZoom(parameters);
camera.setParameters(parameters);

相關推薦

android基於zxing詳細步驟()

公司有個專案是這樣的:要求掃條形碼能識別上面的數字。於是選用了zxing進行掃碼,可一定要吐槽的是:太慢了,一個條形碼要掃5-10秒才能識別。於是換用了zbar進行掃碼。 zbar的速度很快,秒掃,但後面發現一個嚴重的問題,太不準了!不準到一個條形碼我能掃到好

Android基於Retrofit2.0 +RxJava 封裝的的RetrofitClient工具類(六)

RetrofitClient 避免重複建立Retrofit實列. 呼叫方便簡潔. 無需重複設定屬性的步驟. 可固定配置 Host 也可動態配置Url、請求頭、引數等. 支援檔案下載和上傳. 可支援泛型擴充套件的ApiService 支

Android基於Retrofit2.0+RxJava 封裝的的工具類

/** * Created by Tamic on 2016-07-08. */ public interface ApiService { public static final String Base_URL = "http://ip.taobao.com/"; /** *普通寫法 */ @

Android自定義CheckBox CheckGroup

在MaterialDialog 仿Android 5.0原生的AlertDialog樣式的對話方塊一文中以及詳細介紹了單選/多選對話方塊的用法,但是在現實開發中,我們可能需要在Activity上進行單選多選操作,於是就在MaterialDialog庫中進行了再次

ThinkPHP5 支付寶支付擴展庫(簡單,~)

thinkphp5 支付寶支付 alipay 支付寶擴展我的想法是,只需要調用一個靜態方法就可以完成所需要的所有工作,再也不必重復造輪子!ThinkPHP5 支付寶支付擴展庫, 包括手機網站支付、電腦網站支付、支付查詢、退款、退款查詢、對賬單等隨著支付寶官方不斷更新(目前是2017年7月21日),大家可以在G

ThinkPHP5微信支付擴展庫(超級簡單, 超級!)

微信支付 thinkphp5 ThinkPHP5 微信支付擴展庫(2017年9月24日)歡迎到Github查看最新代碼https://github.com/dream2023/ThinkPHP5-wxpay掃碼支付調用\wxpay\NativePay::getPayImage($params)即可小程

發票捕手,的發票OCR識別軟件

jpeg 格式 需要 就是 分享圖片 麻煩 結合 com 圖片 發票報銷始終是各個公司的痛點,整理發票、粘貼發票麻煩不已,傳統報銷程序的延續主要是因為發票的真偽鑒別及費用核查需要紙質發票來核實,也是由於這個原因,紙質發票一直無法融入無紙化辦公及移動辦公系統。如果通過OCR發

學習Linux運維,的七大Linux版本介紹

雲計算眾所周知,Linux是一款Free的系統,這個Free,既可以譯作免費,又可以譯為自由。於是,在網上,就有各種不同的Linux版本供我們選擇。眾版本各有優劣,面向的對象也各有不同,更不用提每個版本還有各種更新的版本差。因此,本文特別邀請×××教育的教學總監楊老師,為大家著重講述一下今年針對不同用途,最合

的webssh(支持秘鑰登錄)

websshwebssh 項目地址: https://github.com/billchurch/WebSSH2 安裝 webssh cd /usr/local/ git clone https://github.com/billchurch/WebSSH2.git cd WebSSH2/ npm insta

基於Zxing的二維的二維掃描之橫掃描

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

的在線PDF轉Word網站,真後悔沒早發現

轉換 轉換成 遇到 -a 電腦 方便 事情 info image 把PDF轉成Word還是經常幹的事情。 然而,下載一大堆軟件來幹這件簡單的事情還是顯得過於繁瑣和復雜。 何況很多網上的軟件安裝常常出問題,在度娘裏面搜索,然後下載又會經常遇到釣魚網站,電腦“中毒”是常事。 有

弱口令掃描工具John the Ripper 圖解使用教程

strong 成功 安裝 pac tab 系統 一段 分享圖片 win 工具介紹 John the Ripper ,簡稱 JR。 用 於 在 已 知 密文 的 情 況 下嘗 試 破 解 出 明 文 的 破 解 密軟件 主要 支 持 對DES、

收藏 || 11個的在線檢查語法的網站!!!

display mar content str bsp variant span inline virtual 超好用的11個在線檢查英語語法的網站分享給大家,希望在日常生活學習工作中幫助到大家。經常用英文的小夥伴,還不趕快收藏,自己覺得好用也要記得分享給朋友喲!

使用ScrollView時解決android佈局不能撐滿的問題

      當ScrollView巢狀LinearLayout,在某些手機上下面會留白,問題的解決辦法是在第一層LinearLayout裡面巢狀多個 LinearLayout,最重要的是將ScrollView中android:fillV

iOS 的本地視訊播放器推薦!

本地播放器作為日常生活中不可或缺的一款工具類APP,Windows、Android等平臺不乏一些功能與體驗兼優的產品,但 iOS 平臺的使用者就沒有那麼幸運了,優秀的產品鳳毛麟角,且多數收費。 這源於 iOS 平臺的特殊性,完美支援各種視訊格式並不容易,幾乎沒有大廠在這方面投入,QQ影音

三款免費的Gif錄神器

本部落格是轉載的 原文:https://blog.csdn.net/u013019701/article/details/80550411 1. 免費開源的GIF錄製工具ScreenToGif 官網地址:http://www.screentogif.com/ ScreenToGif,

的Unix/Linux 命令技巧 大神為你詳細解讀

1、刪除一個大檔案 我在生產伺服器上有一個很大的200GB的日誌檔案需要刪除。我的rm和ls命令已經崩潰,我擔心這是由於巨大的磁碟IO造成的,要刪除這個大檔案,輸入:   > /path/to/file.log   #&n

vue 上拉載入自定義元件,

1.建立元件components > zj-roll > index.vue <template> <div> <slot></slot> <div class='bottom' v-if='(!lastP

vue 上拉加載自定義組件,

pro total ges text dex left touch lang client 1.創建組件components > zj-roll > index.vue <template> <div> <slot&g

的名片識別,告別手輸名片

說到APP,相信每個人手機裡都裝了一大堆,喜歡用的,偶爾用的,不怎麼用的,反正想裝的時候圖個新鮮勁,過了這一陣又換下一波。抖音、王者榮耀、絕地求生、網易雲音樂……等等,在控制不住自己的手甚至要剁掉的時候,還有什麼APP能讓你如此沉迷? 多巴胺,是一種能夠傳遞興奮和開心的神經傳導物質