前言
項目中需要對條形碼進(jìn)行識別,第一念頭就想到Zxing彤蔽,曾經(jīng)用它進(jìn)行過二維碼識別销凑,依稀記得也支持條碼識別彤叉。先上網(wǎng)找相關(guān)資料:
1捺球、 Android二維碼掃描的簡單實現(xiàn)及源碼分析 (其中RGBLuminanceSource source =new RGBLuminanceSource()報錯吕粗,需改為鏈接3中的寫法债蜜。)
2梨州、 ZXing 相冊中識別二維碼和條形碼
4诞吱、幾行代碼快速集成二維碼掃描庫
步驟
1、從Github拉取最新的Zxing包代碼竭缝,優(yōu)化包房维,去除無用功能,僅保留Android中需要使用的功能抬纸×可去Github拉取最新代碼: Zxing ,或者按鏈接1湿故、4找別人優(yōu)化過的包下載到本地阿趁,導(dǎo)入成module并引用。
本工程使用鏈接4中的庫坛猪,為了修改簡單脖阵,直接把整個庫拉下來Import成本地module,添加依賴后墅茉,就可以直接修改CaptureActivity樣式和邏輯命黔。
2、跳轉(zhuǎn)到掃描頁(CaptureActivity)進(jìn)行掃描就斤,掃描出結(jié)果后finish返回結(jié)果
Intent intent = new Intent(GPSSuccessdActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_SCAN);
獲取返回的結(jié)果悍募,在onActivityResult中處理
if(data != null) {
Bundle bundle = data.getExtras();
if(bundle == null) {
return;
}
if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING);
onScanSuccessed(result);//此處是識別成功后具體的邏輯代碼,自行實現(xiàn)洋机。
} else if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
//Toast.makeText(MainActivity.this, "解析條形碼失敗", Toast.LENGTH_LONG).show();
}
}
3坠宴、從相冊中識別條形碼
鏈接4的庫中有封裝好的analyzeBitmap(String path, AnalyzeCallback analyzeCallback),因此只要獲取到圖片路徑就可以進(jìn)行識別绷旗,核心代碼如下
CodeUtils.analyzeBitmap(imgSerialNumber.path, new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
onScanSuccessed(result);
}
@Override
public void onAnalyzeFailed() {
Logger.i("Leon- 識別失敗");
}
});
優(yōu)化
而CodeUtils.analyzeBitmap這個方法里主要實現(xiàn)了對圖片進(jìn)行壓縮啄踊,防止OOM,同時設(shè)置一些識別參數(shù)刁标。
在這里我修改了識別類型颠通,限定了只識別條形碼,這里的原理和上面幾個鏈接中描述的是差不多的膀懈。
// 這里設(shè)置可掃描的類型顿锰,我這里選擇只支持條形碼
decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
//decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
//decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
同時設(shè)置了識別模式,降低速度,但提高識別成功率
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);//設(shè)置盡量識別
階段總結(jié)
攝像頭識別二維碼硼控、條形碼都OK刘陶,從相冊中選取圖片識別二維碼OK,但是識別條形碼效率低下牢撼,和手機(jī)性能有一定關(guān)系匙隔。測試中發(fā)現(xiàn)oppo r9m識別效率竟然低于紅米 Note 5A低配版,不知是oppo系統(tǒng)限制了app性能以保障系統(tǒng)流暢還是小米性價比太高的熏版。
進(jìn)階
上面提到的從相冊中識別效率低下的問題纷责,主要原因是相冊圖片里背景內(nèi)容較多,如果裁剪成合適的大小也是可以識別的撼短。根本原因是Zxing無法很好的定位一維碼區(qū)域再膳,不像二維碼效率那么高,有一個思路是從相冊中獲取圖片時曲横,先識別出條形碼區(qū)域喂柒,裁剪圖片,再調(diào)用Zxing識別禾嫉。
圖片處理的話用Opencv比較簡單灾杰,查了下相關(guān)資料, Opencv:10個步驟檢測出圖片中條形碼 根據(jù)這篇文章的做法熙参,進(jìn)行了相關(guān)優(yōu)化艳吠,發(fā)現(xiàn)部分條形碼區(qū)域可以很好的識別,但成功率不高尊惰。這里就涉及到圖像處理相關(guān)算法了讲竿,因時間有限沒法繼續(xù)鉆研泥兰。且Opencv庫太大了弄屡,添加這個庫后,安裝包從18M變?yōu)?0M鞋诗,成本太高膀捷,暫且記錄,后續(xù)再研究削彬。