Google的zxing來實作二維碼掃描我相信很多人都用過。但是實作的過程遇到了很多的坑,也是因為這些坑在網上沒有具體的解決方案,今天就把我的實作過程分享給大家。
我會分為兩步來和大家分享:
(1)項目中如何內建zxing
(2)如何修改取景框的樣式
(3)總結填坑
1.項目中內建zxing
在項目中內建zxing,網上有很多的教程也說的比較詳細了,zxing中的内容很多,涵蓋了很多的掃碼功能(不僅僅局限于掃描二維碼...)。步驟很簡單,隻需要我們将幾個核心的類包,拷貝到你的項目中,然後添加zxing.jar即可。沒有zxing.jar的童靴
點選下載下傳。
↑ 以上就是幾個我們需要用到的核心類。
↑ 然後在color.xml中添加以上顔色值。
↑ 在ids.xml中添加以上id屬性值。
↑ 在string.xml中添加顯示的提示字元。可自己随意修改。
在zxing中,掃描的界面即Activity已經幫我們寫好了。在activity包下:
是以,我們啟動掃描二維碼的頁面就有了以下代碼:
很簡單,就是啟動該Activity。細心的童靴此處注意到了我們使用的是startActivityForResult。沒過,因為當我們掃描完畢後需要得到最終的掃描結果,ok。順理成章的我們需要重寫onActivityResult方法來擷取結果。
有童靴看到上面的代碼可能會有疑問了,你怎麼知道要根據 "result"這個key來取值呢?ok,我們來看CaptureActivity這類,全局搜尋該類finish的地方,發現如下代碼:
從上面代碼中,我們發現,CaptureActivity是在handleDecode的方法中去傳回值并且finish的。相信你已經看到了,沒錯,在put的地方,key就是我們之前所說的result。ok,解決。
此時,編譯啟動,你就可以看到一個簡單的掃描界面了。
2.如何修取景框的樣式
啟動後,你是不是玩的很爽。感慨Google改變了我們的生活,讓任何事情變得可能。哈哈,扯淡兩句 。此時,有些童靴會說,這取景框(掃描框)跟我的App的主題不太符合呀!确實,Google自帶效果肯定沒有那麼多樣式。那麼就需要我們自己來定義,制作出更加精美和符合自己App主題的效果。定義該效果需要用到下面這個類:
沒錯,就是ViewfinderView。打開這個類:
public final class ViewfinderView extends View可以看到該類繼承自View。是以,顧名思義,我們繪制肯定是在onDraw方法中了。ok,直接定位到onDraw方法,剩下的就是你自己發揮想象力,去定制啦!(比如:四個角,掃描線,等等。。)
3.填坑
本篇文章在開始的時候,我就說了坑坑坑!是以,單憑以上2個部分是滿足不了大家的,那麼,我們下面來看幾個問題:
(1)你是否遇到了,取景框太小,以至于離二維碼很遠才可以掃到?
(2)取景框對準二維碼,二維碼拉伸變形了,根本掃不出結果來!
好,針對以上問題,我們來逐一解決!
首先來看第一個問題,Google考慮到這個問題,是以zxing中提供了修改取景框大小的地方:
在camera包下的CameraManager類中,打開該類,我們看到:
沒錯,這幾個值就是更改取景框大小的常量。
此時,你改變值發現效果也不是很多,那下面這種方案将完美解決你的問題:
找到該類中的getFrameingRect方法:
将原本計算height和width的代碼注釋,添加以下代碼:
ok,運作程式,完美解決。并且加快的掃描的速度(掃描速度取決于取景框的大小)!
填了第一個坑,我們來填第二個:
針對于掃描時,二維碼拉伸變形的問題,是因為zxing預設是針對橫屏掃描的,是以,我們隻需要改變x,y的計算,即橫縱軸即可。此時,我們需要找到CameraConfigurationManager類:
找到findBestPreviewSizeValue方法:
将newDiff的變量計算代碼改成如下:
即調換位置即可。
ok,到此為止,關于zxing的內建使用就已經完美解決了。有問題的童靴歡迎給我留言,我将盡快回複!
注:最近有朋友說近距離掃描二維碼掃描不出,需要遠一點才可以。那麼解決這個問題的方案如下:
找到CameraConfigurationManager類的setDesiredCameraParameters(Camera camera)方法,将其中的代碼注釋,然後添加如下代碼:
原文網址:
原文網址連結