Google的zxing來實(shí)現(xiàn)二維碼掃描我相信很多人都用過等龙。但是實(shí)現(xiàn)的過程遇到了很多的坑处渣,也是因?yàn)檫@些坑在網(wǎng)上沒有具體的解決方案伶贰,今天就把我的實(shí)現(xiàn)過程分享給大家。
我會(huì)分為兩步來和大家分享:
(1)項(xiàng)目中如何集成zxing
(2)如何修改取景框的樣式
(3)總結(jié)填坑
1.項(xiàng)目中集成zxing
在項(xiàng)目中集成zxing霍比,網(wǎng)上有很多的教程也說的比較詳細(xì)了幕袱,zxing中的內(nèi)容很多暴备,涵蓋了很多的掃碼功能(不僅僅局限于掃描二維碼...)悠瞬。步驟很簡(jiǎn)單,只需要我們將幾個(gè)核心的類包涯捻,拷貝到你的項(xiàng)目中浅妆,然后添加zxing.jar即可。沒有zxing.jar的童靴點(diǎn)擊下載障癌。
↑ ?以上就是幾個(gè)我們需要用到的核心類凌外。
↑ ?然后在color.xml中添加以上顏色值。
↑ ?在ids.xml中添加以上id屬性值涛浙。
↑ 在string.xml中添加顯示的提示字符康辑。可自己隨意修改轿亮。
在zxing中疮薇,掃描的界面即Activity已經(jīng)幫我們寫好了。在activity包下:
所以我注,我們啟動(dòng)掃描二維碼的頁面就有了以下代碼:
很簡(jiǎn)單按咒,就是啟動(dòng)該Activity。細(xì)心的童靴此處注意到了我們使用的是startActivityForResult但骨。沒過励七,因?yàn)楫?dāng)我們掃描完畢后需要得到最終的掃描結(jié)果,ok奔缠。順理成章的我們需要重寫onActivityResult方法來獲取結(jié)果掠抬。
有童靴看到上面的代碼可能會(huì)有疑問了,你怎么知道要根據(jù) "result"這個(gè)key來取值呢校哎?ok两波,我們來看CaptureActivity這類,全局搜索該類finish的地方贬蛙,發(fā)現(xiàn)如下代碼:
從上面代碼中雨女,我們發(fā)現(xiàn),CaptureActivity是在handleDecode的方法中去傳回值并且finish的阳准。相信你已經(jīng)看到了氛堕,沒錯(cuò),在put的地方野蝇,key就是我們之前所說的result讼稚。ok括儒,解決。
此時(shí)锐想,編譯啟動(dòng)帮寻,你就可以看到一個(gè)簡(jiǎn)單的掃描界面了。
2.如何修取景框的樣式
啟動(dòng)后赠摇,你是不是玩的很爽固逗。感慨Google改變了我們的生活,讓任何事情變得可能藕帜。哈哈烫罩,扯淡兩句 。此時(shí)洽故,有些童靴會(huì)說贝攒,這取景框(掃描框)跟我的App的主題不太符合呀!確實(shí)时甚,Google自帶效果肯定沒有那么多樣式隘弊。那么就需要我們自己來定義,制作出更加精美和符合自己App主題的效果荒适。定義該效果需要用到下面這個(gè)類:
沒錯(cuò)梨熙,就是ViewfinderView。打開這個(gè)類:
public final classViewfinderViewextendsView
可以看到該類繼承自View吻贿。所以串结,顧名思義,我們繪制肯定是在onDraw方法中了舅列。ok肌割,直接定位到onDraw方法,剩下的就是你自己發(fā)揮想象力帐要,去定制啦0殉ā(比如:四個(gè)角,掃描線榨惠,等等奋早。。)
3.填坑
本篇文章在開始的時(shí)候赠橙,我就說了坑坑坑耽装!所以,單憑以上2個(gè)部分是滿足不了大家的期揪,那么掉奄,我們下面來看幾個(gè)問題:
(1)你是否遇到了,取景框太小凤薛,以至于離二維碼很遠(yuǎn)才可以掃到姓建?
(2)取景框?qū)?zhǔn)二維碼诞仓,二維碼拉伸變形了,根本掃不出結(jié)果來速兔!
好墅拭,針對(duì)以上問題,我們來逐一解決涣狗!
首先來看第一個(gè)問題谍婉,Google考慮到這個(gè)問題,所以zxing中提供了修改取景框大小的地方:
在camera包下的CameraManager類中屑柔,打開該類屡萤,我們看到:
沒錯(cuò)珍剑,這幾個(gè)值就是更改取景框大小的常量掸宛。
此時(shí),你改變值發(fā)現(xiàn)效果也不是很多招拙,那下面這種方案將完美解決你的問題:
找到該類中的getFrameingRect方法:
將原本計(jì)算height和width的代碼注釋唧瘾,添加以下代碼:
ok,運(yùn)行程序别凤,完美解決饰序。并且加快的掃描的速度(掃描速度取決于取景框的大小)规哪!
填了第一個(gè)坑求豫,我們來填第二個(gè):
針對(duì)于掃描時(shí),二維碼拉伸變形的問題诉稍,是因?yàn)閦xing默認(rèn)是針對(duì)橫屏掃描的蝠嘉,所以,我們只需要改變x,y的計(jì)算杯巨,即橫縱軸即可蚤告。此時(shí),我們需要找到CameraConfigurationManager類:
找到findBestPreviewSizeValue方法:
將newDiff的變量計(jì)算代碼改成如下:
即調(diào)換位置即可服爷。
ok杜恰,到此為止,關(guān)于zxing的集成使用就已經(jīng)完美解決了仍源。有問題的童靴歡迎給我留言心褐,我將盡快回復(fù)!
注:最近有朋友說近距離掃描二維碼掃描不出笼踩,需要遠(yuǎn)一點(diǎn)才可以逗爹。那么解決這個(gè)問題的方案如下:
找到CameraConfigurationManager類的setDesiredCameraParameters(Camera camera)方法,將其中的代碼注釋戳表,然后添加如下代碼:
原文網(wǎng)址:原文網(wǎng)址鏈接