zxing二维码识别Helper类

博客介绍了如何创建一个ZXing二维码识别的Helper类,该类包含一个回调接口用于在解码完成后在新线程中输出结果。若需更新UI,建议使用Handler进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

封装成Helper类,特此记载,也希望能帮助到后来者

定义了一个回调接口用于解码后输出结果,运行于新线程,如要进行UI操作自行调用Handler接口

public class CameraDecodeHelper implements SurfaceHolder.Callback, PreviewCallback {
	// 回调接口
	public interface Callback {
		public void onResult(String reslut, String barFormat);
	}

	/**
	 * 自动对焦
	 */
	private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() {

		@Override
		public void onAutoFocus(boolean success, Camera camera) {
			if (success) { // 对焦成功,回调Camera.PreviewCallback
				mCamera.setOneShotPreviewCallback(previewCallback);
			}
		}
	};

	// 执行自动对焦后解码条码和二维码
	private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
		@Override
		public void onPreviewFrame(final byte[] data, Camera arg1) {
			// 如果是竖屏则旋转取得的对焦结果
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO 自动生成的方法存根
					Decode(data);
				}
			}).start();
			

		}
	};
	
	private void Decode(byte[] data){
		if (shuflag) {
			byte[] rotatedData = new byte[data.length];
			for (int y = 0; y < height; y++) {
				for (int x = 0; x < width; x++)
					rotatedData[x * height + height - y - 1] = data[x + y
							* width];
			}
			data = rotatedData;
		}

		// 取得指定范围的帧的数据

		try {
			PlanarYUVLuminanceSource source;
			source = shuflag ? new PlanarYUVLuminanceSource(data, height,
					width, 0, 0, height, width, false)
					: new PlanarYUVLuminanceSource(data, width, height, 0,
							0, width, height, false);

			BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
					source));
			MultiFormatReader reader = new MultiFormatReader();
			Result result = reader.decode(bitmap);
			String reText = result.getText();
			String barFormat = result.getBarcodeFormat().toString();
			if (callback!=null) {
				callback.onResult(reText, barFormat);
			}
			mTimer.cancel();
		} catch (Exception e) {

		}
	}

	// 开关闪光灯
	public void setFlash() {
		if (shanflag) {
			Camera.Parameters parameter = mCamera.getParameters();
			parameter.setFlashMode(Parameters.FLASH_MODE_OFF);
			mCamera.setParameters(parameter);
			shanflag = false;
		} else {
			Camera.Parameters parameter = mCamera.getParameters();
			parameter.setFlashMode(Parameters.FLASH_MODE_TORCH);
			mCamera.setParameters(parameter);
			shanflag = true;
		}
	}

	private SurfaceHolder holder = null;
	private Camera mCamera;
	private int width = 640;
	private int height = 480;
	private Callback callback;
	private boolean shanflag = false;
	private boolean shuflag = true;
	private Timer mTimer;

	public CameraDecodeHelper(SurfaceHolder mHolder, Camera arg,
			boolean portrait, Callback c) {
		this.holder = mHolder;
		this.holder.addCallback(this);
		this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		mTimer = new Timer();
		mCamera = arg;
		callback = c;
		shuflag = portrait;
		if (shuflag) {
			mCamera.setDisplayOrientation(90);
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		Camera.Parameters parameters = mCamera.getParameters();
		parameters.setPreviewSize(width, height);// 设置尺寸
		parameters.setPictureFormat(PixelFormat.JPEG);
		mCamera.setParameters(parameters);
		mCamera.startPreview();// 开始预览
	}

	@Override
	public void surfaceCreated(SurfaceHolder arg0) {
		// mCamera = Camera.open();//启动服务
		try {
			mCamera.setPreviewDisplay(holder);// 设置预览
			mCamera.setPreviewCallback(this);
		} catch (IOException e) {
			mCamera.release();// 释放
			mCamera = null;
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
		mCamera.setPreviewCallback(null);
		mCamera.stopPreview();// 停止预览
		holder.removeCallback(this);
	}

	// 启动自动对焦并回调
	public void AutoFocusAndPreviewCallback(long when, long replay) {
		if (mCamera != null) {
			mTimer.schedule(new TimerTask() {

				@Override
				public void run() {
					// TODO 自动生成的方法存根
					mCamera.autoFocus(mAutoFocusCallBack);
				}
			}, when, replay);

		}
	}
	
	//退出
	public void exit(){
		mTimer.cancel();
	}

	@Override
	public void onPreviewFrame(final byte[] arg0, Camera arg1) {
		// TODO 自动生成的方法存根
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO 自动生成的方法存根
				Decode(arg0);
			}
		}).start();
	}
}


调用示例如下

private void getCode(){
		//surfaceView请自行创建,相机记得在activity中打开
		decodeHelper = new CameraDecodeHelper(cview.getHolder(), camera, true, this);
		//500ms后开始对焦,400ms循环
		decodeHelper.AutoFocusAndPreviewCallback(500, 400);
		
	}

实现接口中OnResult方法

public void onResult(final String reslut,final String barFormat) {
		new Handler().post(new Runnable() {
			
			@Override
			public void run() {
				// TODO 自动生成的方法存根
				
				alert.cancel();
				camera.setPreviewCallback(null);
				Toast.makeText(ScreenNewSpecies.this,barFormat+":"+ reslut, 3000).show();

			}
		});
		
		
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值