ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码
我怎么有二維碼沒有聯系,最近遇到一個問題,,如何推斷條碼掃描到一維代碼或者二維代碼,辛苦了一個下午下班后自己,加上網上跟蹤信息。
總結出兩種方式能夠解決該問題(推薦採用另外一種方式):
1.改動源代碼(詳細后面會提到)
2.通過返回的編碼來推斷
實現方式一:
源代碼的改動,關鍵涉及到三個類,CaptureActivity、DecodeThread、DecodeFormatManager
1.首先讓我們來看下Zxing的源代碼。里面有一個DecodeFormatManager編碼管理類:該來原本的final類,由于須要用到該類里的一些參數,所以要把它變成普通類,可是不知道這樣改變以后對原本的代碼結構是否有影響。
還有就是有幾個變量也是常量型的,這里要都要改成static類型的:
public class DecodeFormatManager {
//final class DecodeFormatManager {
public static Vector<BarcodeFormat> PRODUCT_FORMATS;
public static Vector<BarcodeFormat> ONE_D_FORMATS;
public static Vector<BarcodeFormat> QR_CODE_FORMATS;
public static Vector<BarcodeFormat> DATA_MATRIX_FORMATS;
//static final Vector<BarcodeFormat> PRODUCT_FORMATS;
//static final Vector<BarcodeFormat> ONE_D_FORMATS;
//static final Vector<BarcodeFormat> QR_CODE_FORMATS;
//static final Vector<BarcodeFormat> DATA_MATRIX_FORMATS;
static {
PRODUCT_FORMATS = new Vector<BarcodeFormat>(5);
PRODUCT_FORMATS.add(BarcodeFormat.UPC_A); // UPC標準碼(通用商品)
PRODUCT_FORMATS.add(BarcodeFormat.UPC_E); // UPC縮短碼(商品短碼)
PRODUCT_FORMATS.add(BarcodeFormat.EAN_13);
PRODUCT_FORMATS.add(BarcodeFormat.EAN_8);
PRODUCT_FORMATS.add(BarcodeFormat.RSS14);
ONE_D_FORMATS = new Vector<BarcodeFormat>(PRODUCT_FORMATS.size() + 4);
ONE_D_FORMATS.addAll(PRODUCT_FORMATS); //此處將PRODUCT_FORMATS中加入的碼加入到ONE_D_FORMATS
ONE_D_FORMATS.add(BarcodeFormat.CODE_39);
ONE_D_FORMATS.add(BarcodeFormat.CODE_93);
ONE_D_FORMATS.add(BarcodeFormat.CODE_128);
ONE_D_FORMATS.add(BarcodeFormat.ITF);
QR_CODE_FORMATS = new Vector<BarcodeFormat>(1);//QR_CODE即二維碼
QR_CODE_FORMATS.add(BarcodeFormat.QR_CODE);
DATA_MATRIX_FORMATS = new Vector<BarcodeFormat>(1);
DATA_MATRIX_FORMATS.add(BarcodeFormat.DATA_MATRIX);//也屬于一種二維碼
}
}
該類中主要就是把一些經常使用的條碼格式給加入到Vector<BarcodeFormat>集合里面,當中有一維碼、二維碼等。
最后一個DATA_MATRIX這個也屬于是一種二維碼。
2.上面的改動完了一會,然后是DecodeThread。這個是解碼類
這里不須要我們做什么操作,僅僅要知道這里是怎樣解碼的即可了,關鍵的地方就是這里:
if (decodeFormats == null || decodeFormats.isEmpty()) {
decodeFormats = new Vector<BarcodeFormat>();
decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS); // 一維碼
decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS); // 二維碼
decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
}
這里把之前加入好的幾個常量類,加入到解碼的方法里面去,這樣解碼方法里面就有了全部的解碼格式了。包含一維碼和二維碼。
3.關鍵的地方來了。CaptureActivity,掃描后返回信息的類。
Zxing源代碼相信大家都能下到,也知道掃描后返回的值,里面有一個public void handleDecode(Result result, Bitmap barcode);方法,
返回的值就是在這里:
// 掃描后的結果 和 編碼
Log.e("編碼: ------>",result.getBarcodeFormat().toString()+" 數據:"+result.getText());
關鍵是這一句話:
result.getBarcodeFormat().toString() 返回的就是編碼格式。
result.getText(); 返回的才是掃描的值。
所以,我們主須要推斷之前的編碼管理類里的向量數組是否包括這個字段就OK了,迭代:
/**********************************************
* 注:此處依據 拍碼后返回的編碼格式 與 DecodeFormatManager
* 類中的二維碼 編碼格式 進行對照
*
* 同樣則將標示字段賦值為1(即一維碼)
* 否者則將標示字段賦值為2(即二維碼)
**********************************************/
int size = DecodeFormatManager.ONE_D_FORMATS.size(); //遍歷一維碼字符集
for (int i = 0; i < size; i++) {
Log.e(" 一維碼編碼格式 ------>",DecodeFormatManager.ONE_D_FORMATS.get(i)+"");
//此處依據 拍碼后返回的編碼格式 與 DecodeFormatManager類中的一維碼 編碼格式 進行對照
//同樣則將標示字段賦值為1(即一維碼) 否者將標示字段賦值為2(即二維碼)
if(DecodeFormatManager.ONE_D_FORMATS.get(i).equals(mBarcodeFormat)){
ONE_D_FORMATS = 1;
}else {
QR_CODE_FORMATS = 2;
}
}
實現方式二:
在public void handleDecode(Result result, Bitmap barcode);方法中加入兩個常量,自己定義QR_CODE和
DATA_MATRIX兩個常量碼,然后當掃描返回時。通過result.getBarcodeFormat().toString()獲得返回編碼。再依據該返回碼與自己定義的編碼去比對。然后定義個字符串或int變量作為標示,例如以下:
int CODE_TYPE = -1; //標示 (1一維碼、 2、二維碼 3、其它碼)
final String QR_CODE = "QR_CODE"; //二維碼
final String DATA_MATRIX = "DATA_MATRIX"; //其它碼
//掃描獲取的 編碼 不為空
if(!TextUtils.isEmpty(result.getBarcodeFormat().toString())){
String mBarcodeFormat = result.getBarcodeFormat().toString(); //拍碼后返回的編碼格式
if(mBarcodeFormat.equals(DATA_MATRIX)){
CODE_TYPE = 3;
}else if(mBarcodeFormat.equals(QR_CODE)){
CODE_TYPE = 2;
}else {
CODE_TYPE = 1;
}
Log.e("---> (1一維碼、 2、二維碼 3、其它碼) ",""+CODE_TYPE);
接著后面就能夠 switch 這個CODE_TYPE標示來推斷實行那些操作了
部分條碼規則:
<img src="http://img.blog.csdn.net/20141111234433467?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvX2NodW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
總結
以上是生活随笔為你收集整理的ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 商城系统购物车功能分析实现
- 下一篇: 使用命令行的方式,将ini配置文件中的配