做公司项目的时候需要实现类似于超市扫描枪一样的,连续扫描。下面说说我的实现方法。
既然要修改Zxing的源码,就要找到Zxing里面的CaptureActivity这个类,这里面内容是点击扫描按钮跳转到扫描界面和一些扫描完以后获取条形码(二维码)数据的方法。大部分大同小异,我把这个类贴出来 :

public final class CaptureActivity extends Activity implements
SurfaceHolder.Callback {

private static final String TAG = CaptureActivity.class.getSimpleName();private CameraManager cameraManager;
private CaptureActivityHandler handler;
private InactivityTimer inactivityTimer;
private BeepManager beepManager;private SurfaceView scanPreview = null;
private RelativeLayout scanContainer;
private RelativeLayout scanCropView;
private ImageView scanLine;private Rect mCropRect = null;public Handler getHandler() {return handler;
}public CameraManager getCameraManager() {return cameraManager;
}private boolean isHasSurface = false;@Override
public void onCreate(Bundle icicle) {super.onCreate(icicle);Window window = getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.activity_capture);scanPreview = (SurfaceView) findViewById(R.id.capture_preview);scanContainer = (RelativeLayout) findViewById(R.id.capture_container);scanCropView = (RelativeLayout) findViewById(R.id.capture_crop_view);scanLine = (ImageView) findViewById(R.id.capture_scan_line);inactivityTimer = new InactivityTimer(this);beepManager = new BeepManager(this);TranslateAnimation animation = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.0f,Animation.RELATIVE_TO_PARENT, 0.9f);animation.setDuration(4500);animation.setRepeatCount(-1);animation.setRepeatMode(Animation.RESTART);scanLine.startAnimation(animation);
}@Override
protected void onResume() {super.onResume();// CameraManager must be initialized here, not in onCreate(). This is// necessary because we don't// want to open the camera driver and measure the screen size if we're// going to show the help on// first launch. That led to bugs where the scanning rectangle was the// wrong size and partially// off screen.cameraManager = new CameraManager(getApplication());handler = null;if (isHasSurface) {// The activity was paused but not stopped, so the surface still// exists. Therefore// surfaceCreated() won't be called, so init the camera here.initCamera(scanPreview.getHolder());} else {// Install the callback and wait for surfaceCreated() to init the// camera.scanPreview.getHolder().addCallback(this);}inactivityTimer.onResume();
}@Override
protected void onPause() {if (handler != null) {handler.quitSynchronously();handler = null;}inactivityTimer.onPause();beepManager.close();cameraManager.closeDriver();if (!isHasSurface) {scanPreview.getHolder().removeCallback(this);}super.onPause();
}@Override
protected void onDestroy() {inactivityTimer.shutdown();super.onDestroy();
}@Override
public void surfaceCreated(SurfaceHolder holder) {if (holder == null) {Log.e(TAG,"*** WARNING *** surfaceCreated() gave us a null surface!");}if (!isHasSurface) {isHasSurface = true;initCamera(holder);}
}@Override
public void surfaceDestroyed(SurfaceHolder holder) {isHasSurface = false;
}@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}/*** A valid barcode has been found, so give an indication of success and show* the results.* * @param rawResult*            The contents of the barcode.* * @param bundle*            The extras*/
public void handleDecode(Result rawResult, Bundle bundle) {inactivityTimer.onActivity();beepManager.playBeepSoundAndVibrate();if (rawResult != null && !rawResult.getText().equalsIgnoreCase("")) {Intent intent = new Intent();intent.putExtra("scan_result", rawResult.getText());setResult(RESULT_OK, intent);} else {setResult(RESULT_CANCELED);}CaptureActivity.this.finish();
}private void initCamera(SurfaceHolder surfaceHolder) {if (surfaceHolder == null) {throw new IllegalStateException("No SurfaceHolder provided");}if (cameraManager.isOpen()) {Log.w(TAG,"initCamera() while already open -- late SurfaceView callback?");return;}try {cameraManager.openDriver(surfaceHolder);// Creating the handler starts the preview, which can also throw a// RuntimeException.if (handler == null) {handler = new CaptureActivityHandler(this, cameraManager,DecodeThread.ALL_MODE);}initCrop();} catch (IOException ioe) {Log.w(TAG, ioe);displayFrameworkBugMessageAndExit();} catch (RuntimeException e) {// Barcode Scanner has seen crashes in the wild of this variety:// java.?lang.?RuntimeException: Fail to connect to camera serviceLog.w(TAG, "Unexpected error initializing camera", e);displayFrameworkBugMessageAndExit();}
}private void displayFrameworkBugMessageAndExit() {// camera errorAlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(getString(R.string.app_name));builder.setMessage("相机打开出错,请稍后重试");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}});builder.setOnCancelListener(new DialogInterface.OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {finish();}});builder.show();
}public void restartPreviewAfterDelay(long delayMS) {if (handler != null) {handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS);}
}public Rect getCropRect() {return mCropRect;
}/*** 初始化截取的矩形区域*/
private void initCrop() {int cameraWidth = cameraManager.getCameraResolution().y;int cameraHeight = cameraManager.getCameraResolution().x;/** 获取布局中扫描框的位置信息 */int[] location = new int[2];scanCropView.getLocationInWindow(location);int cropLeft = location[0];int cropTop = location[1] - getStatusBarHeight();int cropWidth = scanCropView.getWidth();int cropHeight = scanCropView.getHeight();/** 获取布局容器的宽高 */int containerWidth = scanContainer.getWidth();int containerHeight = scanContainer.getHeight();/** 计算最终截取的矩形的左上角顶点x坐标 */int x = cropLeft * cameraWidth / containerWidth;/** 计算最终截取的矩形的左上角顶点y坐标 */int y = cropTop * cameraHeight / containerHeight;/** 计算最终截取的矩形的宽度 */int width = cropWidth * cameraWidth / containerWidth;/** 计算最终截取的矩形的高度 */int height = cropHeight * cameraHeight / containerHeight;/** 生成最终的截取的矩形 */mCropRect = new Rect(x, y, width + x, height + y);
}private int getStatusBarHeight() {try {Class<?> c = Class.forName("com.android.internal.R$dimen");Object obj = c.newInstance();Field field = c.getField("status_bar_height");int x = Integer.parseInt(field.get(obj).toString());return getResources().getDimensionPixelSize(x);} catch (Exception e) {e.printStackTrace();}return 0;
}

}

才开始实现的时候用的下面这个方法。在handleDecode()里面调用,然后在CaptureActivityHandler这个类里面把restartPreviewAndDecode这个方法private 改成public。发现也是可以用的,但是速度太快,操作起来不怎么方便。
private void continuePreview() {
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.capture_preview);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
initCamera(surfaceHolder);
if (handler != null) {
handler.restartPreviewAndDecode();
}
}

最后,最后,最后自己直接用定时器来实现,很完美了。在handleDecode()这个方法里面,获取到数据以后直接添上这句代码 mHandler.postDelayed(runnable, 3000); 。下面是方法。

Handler mHandler = new Handler();
Runnable runnable = new Runnable() {

    @Overridepublic void run() {// handler自带方法实现定时器try {if (handler != null)mHandler.postDelayed(runnable, 3000);handler.restartPreviewAndDecode(); // 实现多次扫描System.out.println("do...");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("exception...");}}
};

Andriod Zxing 二维码扫描 实现连续扫描相关推荐

  1. 自定义ZXing二维码扫描界面并解决取景框拉伸等问题

    自定义ZXing二维码扫描界面并解决取景框拉伸等问题 参考文章: (1)自定义ZXing二维码扫描界面并解决取景框拉伸等问题 (2)https://www.cnblogs.com/tommylemon ...

  2. Android 集成zxing二维码扫描、自定义

    项目主要有zxing的基本使用,包含扫描回调.连续扫描.自定义扫描框: 一.依赖库 implementation 'com.journeyapps:zxing-android-embedded:4.3 ...

  3. Android 基于Zxing二维码扫描的光速实现

    Android 十分钟光速实现二维码扫描 前言 在项目中要使用到二维码的相关内容,我们第一时间想到的是使用大名鼎鼎的zxing或者ZBar开源框架: github-zxing官方库的地址 github ...

  4. Android Zxing二维码扫描优化

    关于Zxing的使用,网上有大量优秀的文章讲解,本文不再叙述. 用过Zxing的童鞋都知道Zxing扫描识别率较低,速度较慢.这里介绍一个第三方库,github地址为: https://github. ...

  5. zxing二维码扫描预览变形的解决方案

    -----------------------------------2018.6.1更新--------------------------------------- 附上github地址: htt ...

  6. Android项目如何集成ZXing二维码扫描功能

    最近的项目有二维码扫描跳转网页的需求,就是利用手机摄像头,扫描并解析二维码内容,内容由生成二维码的时候定义,我项目现在的需求就是一个包含了网址的二维码,网上有生成二维码的工具,也可以自己开发一个. 搜 ...

  7. zxing 二维码扫描优化

    先罗列优化点: 1.优化扫描精度 (增加解析成功率) hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); 2.生成图片(用于被解析)时不剪切图片(增 ...

  8. zxing二维码扫描

    最近项目中要做一个二维码扫描的功能,之前用过,但是实现的效果不太好,通过查询,找到了一个比较好用的 implementation 'cn.bingoogolapple:bga-qrcode-zxing ...

  9. 关于ZXing二维码扫描的时候偶然出现数字问题

    今天在测试项目的时候发现,在多次扫描同一个生成二维码的时候,小米手机有机会偶然出现扫描的结果全是数字的情况,暂时没有想到到的解决方法,只能是在扫描出结果之后,判断下是否全是数字,如果是的话继续开始扫描 ...

最新文章

  1. Python源码学习:Python函数浅析-有参函数
  2. java信息管理系统总结_java实现科研信息管理系统
  3. cal css,CSS calc计算属性
  4. 网站SEO优化过程中的几个注意事项
  5. bzoj3202:[Sdoi2013]项链
  6. SLAM_视觉SLAM中的一种单目稠密建图方法
  7. 【设计】全差分设计报告
  8. studio one 3 机架声道设置_雅马哈声卡的设置和使用方法
  9. 中职生计算机求职信350,护士求职信350字
  10. 高景一号01星遥感影像解译数据分辨率是多少
  11. python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法
  12. 2022年襄阳中级工程师职称水平能力测试成绩出来了吗?
  13. ffmpeg AV转换常用命令
  14. 2016山东省第七届ACM省赛总结
  15. C++中set容器的基本使用----在B站听黑马程序员c++课程的记录
  16. android Menu菜单组键
  17. 2017JAVA秋招总结
  18. 昂达vi40精英版刷Linux,昂达vi40旗舰版刷机教程【图解】
  19. java判断一个月连续打卡时间_java并发编程实战《五》死锁 挑战打卡60天
  20. 【运筹学】线性规划数学模型 ( 单纯形法 | 迭代原则 | 入基 | 出基 | 线性规划求解示例 )

热门文章

  1. Matlab任意两点之间绘制带箭头的直线
  2. 计算机组成原理浮点规格化,规格化浮点数
  3. 怎么使用迅捷PDF转换器转换视频?
  4. 如何快速获取知识-方法的方法
  5. DCMTK 打印胶片实验
  6. JAVA实习生刚进入公司一般会被安排做什么样的工作?
  7. ​PCA/PCC软件中一键式超高密度的无人机LiDAR点云滤波和精细地形提取
  8. windows安装nodejs【详细教程】
  9. 读取xml到DataSet中去
  10. Matlab实现 k均值算法(k-means)