一、應(yīng)用場景
用戶A從契約鎖WEB端分享合同二維碼給合同相關(guān)的人員B,用戶B使用契約鎖手機客戶端進行掃碼簽署。
二、技術(shù)選型
這里選擇Zxing有如下原因:
- 開源
- 文檔完善,用戶量大
- google出品
三、Zxing接入步驟
3.1 基本概念
Zxing的二維碼功能有兩部分組成:圖片獲取+圖片解析
3.2 圖片獲取-掃描
核心思路:通過重寫Camera的預(yù)覽回調(diào)類:Camera.PreviewCallback,當存在預(yù)覽幀(preview frame)時調(diào)用onPreviewFrame方法獲取圖片。
3.2.1 自定義的預(yù)覽回調(diào)方法:
public final class PreviewCallback implements Camera.PreviewCallback {
...
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
//得到當前圖像像素的字節(jié)數(shù)組data,進行掃描框大小的裁剪,將裁剪后的圖片(二維碼)調(diào)用圖片解析庫,獲取解析結(jié)果
}
}
3.2.2 為Camera添加上面的預(yù)覽回調(diào):
Camera camera;
PreviewCallback previewCallback;
...
if (Build.VERSION.SDK_INT > 3) {
//考慮到我們app最低兼容版本為API15,使用setOneShotPreviewCallback方法
camera.setOneShotPreviewCallback(previewCallback);
} else {
camera.setPreviewCallback(previewCallback);
}
3.3 圖片解析
Zxing圖片解析功能在core文件夾中,去除掉里面的測試代碼模塊,生成jar包。
3.3.1 根據(jù)圖片,調(diào)用圖片解析方法:
/**
* 圖片解析
*
* @param data 圖像像素的字節(jié)數(shù)組data
* @param width 圖像寬
* @param height 圖像高
*/
private void decode(byte[] data, int width, int height) {
Result rawResult = null;
...
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
rawResult = multiFormatReader.decodeWithState(bitmap);
//rawResult.getText()便是獲得的解析結(jié)果
}
四、周邊技術(shù)點
在主要技術(shù)點周邊還有預(yù)覽圖片的裁剪功能,解析失敗后的Camera重試,圖片的旋轉(zhuǎn)都需要完成,本地圖片的獲取。