[TOC]
前言
最近在做一些Android組件的編寫(xiě),掃描二維碼是Android中很常用的組件,因此在參考了前人開(kāi)發(fā)經(jīng)驗(yàn)的基礎(chǔ)上對(duì)這部分知識(shí)進(jìn)行一個(gè)總結(jié),有錯(cuò)誤之處還請(qǐng)大神之處,由于會(huì)詳細(xì)介紹封裝過(guò)程,博文比較長(zhǎng),分成三篇
本次二維碼開(kāi)發(fā)是基于zxing-android-embedded這個(gè)庫(kù)的基礎(chǔ)上進(jìn)行開(kāi)發(fā)。這個(gè)庫(kù)是在谷歌zxing庫(kù)的基礎(chǔ)上對(duì)一些方法進(jìn)行了封裝,更方便開(kāi)發(fā)者調(diào)用。
一、二維碼基本功能實(shí)現(xiàn)
導(dǎo)入zxing-android-embedded和zxing核心庫(kù) 由于我使用Android studio開(kāi)發(fā) 因此采用gradle
compile 'com.journeyapps:zxing-android-embedded:3.4.0'
compile 'com.google.zxing:core:3.2.1'
掃碼
/**
* 開(kāi)啟掃描界面
*
* @param view
*/
public void start(View view) {
new IntentIntegrator(this)
.setOrientationLocked(false)
.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES)
.setPrompt("將二維碼/條碼放入框內(nèi),即可自動(dòng)掃描")
.initiateScan(); // 初始化掃描
}
/**
*在onActivityResult中接收掃描結(jié)果
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
String result = intentResult.getContents();
}
- 效果()

normal_scanner.png
生成二維碼Bitmap
public static Bitmap createQRBitmap(String context) {
Bitmap bitmap = null;
BitMatrix matrix = null;
MultiFormatWriter writer = new MultiFormatWriter();
try {
//設(shè)置格式
Map<EncodeHintType, Object> encodeHintTypeMap = new HashMap<>();
//設(shè)置二維碼邊空白的寬度
encodeHintTypeMap.put(EncodeHintType.MARGIN,2);
matrix = writer.encode(context, BarcodeFormat.QR_CODE, 400, 400, encodeHintTypeMap);//400表示生成bitmap大小
BarcodeEncoder encoder = new BarcodeEncoder();
bitmap = encoder.createBitmap(matrix);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
識(shí)別圖中二維碼
/**
* 識(shí)別bitmap中的二維碼信息
*
* @param bitmap
* @return
*/
public static Result spotQRcode(Bitmap bitmap) throws FormatException, ChecksumException, NotFoundException {
Result result = null;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] data = new int[width * height];
bitmap.getPixels(data, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, data);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
//result中包含了掃描到的信息,調(diào)用 result.getText()可以獲取到文本信息
result = reader.decode(binaryBitmap);
return result;
}
- 效果

create_qr_bm.gif
總結(jié)
這篇文章主要講解了二維碼三個(gè)基本功能的實(shí)現(xiàn),下一篇將講解對(duì)這些功能的封裝優(yōu)化,如果錯(cuò)誤還請(qǐng)指正,感謝。