今天一个朋友问在使用zxing扫描得到结果后,不知道如何再次扫描
先理解一下连续扫描和再次扫描
正常情况下通过扫描得到结果后停止扫描
连续扫描:得到结果后继续扫描,类似超市扫描商品
再次扫描:得到结果后经过确认后再次扫描
两者逻辑处理有很大区别的
默认情况下逻辑
/**
* 扫描成功,处理反馈信息
*
* @param rawResult
* @param barcode
* @param scaleFactor
*/
public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
inactivityTimer.onActivity();
boolean fromLiveScan = barcode != null;
//这里处理解码完成后的结果,此处将参数回传到Activity处理
if (fromLiveScan) {
//扫描的结果
String result = rawResult.getText();
}
}
这个时候你会发现得到结果后,无法继续扫描
连续扫描:
调用restartPreviewAndDecode();
但是有缺点就是一个二维码会扫码多次
public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
inactivityTimer.onActivity();
boolean fromLiveScan = barcode != null;
//这里处理解码完成后的结果,此处将参数回传到Activity处理
if (fromLiveScan) {
//扫描的结果
String result = rawResult.getText();
/*
do something
*/
if (handler != null) {
handler.restartPreviewAndDecode();
}
}
}
再次扫描:
先退出然后重新初始相机
/**
* 扫描成功,处理反馈信息
*
* @param rawResult
* @param barcode
* @param scaleFactor
*/
public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
inactivityTimer.onActivity();
boolean fromLiveScan = barcode != null;
//这里处理解码完成后的结果,此处将参数回传到Activity处理
if (fromLiveScan) {
closeCamera();
String result = rawResult.getText();
/*
do something
*/
new AlertDialog.Builder(this)
.setMessage("扫描结果"+result+"\n是否再次扫描")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
dialog.dismiss();
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
restartCamera();
dialog.dismiss();
}
}).setCancelable(false)
.create().show();
}
}
private void closeCamera(){
//完全退出
if (handler != null) {
handler.quitSynchronously();
handler = null;
}
inactivityTimer.onPause();
// 关闭设备相机
cameraManager.closeDriver();
}
private void restartCamera(){
viewfinderView.setVisibility(View.VISIBLE);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
initCamera(surfaceHolder);
// 恢复活动监控器
inactivityTimer.onResume();
}
各有各的用途 根据洗好自己选择