Android Zxing条码扫描自定义控件(附代码)

团队要做一个项目,里面要用到条码扫描,搜了一下,知道了Zxing。这是一个开源的条码扫描程序。官方网站有完整的Android程序可下载。但是,如果想将扫描功能融合在自己开发的程序里,则需要理清设计的思路,并去掉一些没有必要的代码。

为了让团队更方便使用,我将Zxing代码做了封装,做成了一个自定义View控件,并且生成了jar文件,可以在Android程序里直接引用。这个控件解决了不少网友询问的竖屏和横屏摆放的问题。

使用该控件很简单。首先要在项目目录下,建一个libs目录,将ZxingScanner.jar文件放进去。

然后建立项目引用,如下步骤:

1.通过Eclipse菜单Project->Properties->Java Build Path->Libraries,点击Add library;

2.选择User Library ,点击Next,点击User Library,点击New,输入随意的Library Name,比如ZxingScanner;

3.选择刚才创建的Library Name,点击Add JARs,找到libs目录下的ZxingScanner.jar,加入;

4.在Java Build Path的Libraries窗口中,就应该有这个带上了ZxingScanner.jar的library了。


因为扫描要用到相机,所以接着要设置AndroidManifest.xml,在里面加入使用相机的权限。

<uses-permission android:name="android.permission.CAMERA"></uses-permission>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
	<uses-feature android:name="android.hardware.camera" />
	<uses-feature android:name="android.hardware.camera.autofocus" />
	<uses-permission android:name="android.permission.VIBRATE"/>
  <uses-permission android:name="android.permission.FLASHLIGHT"/>

建议将控件放在一个横屏的Activity里,这样的话,由于扫描框的宽度大于高度,扫描条码时,可以将手机比较靠近条码。将Activity设为横屏大家都应该会了,但我还是附上代码吧,其实就是在AndroidManifest.xml的activity标签里加上下面这一句:

android:screenOrientation="landscape"
            android:configChanges="orientation|keyboardHidden"

在activity的layout里,加上自定义控件ScannerView的布局:

<com.covics.zxingscanner.ScannerView
         android:id="@+id/scanner_view"
         android:layout_width="fill_parent"
      android:layout_height="fill_parent"/>   

这样,当activity打开时,会看到控件占据的区域内是相机影像,只要将中间的框对准条码,框中间的红线压住条码,就能识别。

别急,activity中还是要写一些代码的。

我定义的activity叫ZXingScannerActivity,它的作用是将控件识别的条码显示在一个TextView-txtResult上。代码如下:

package com.covics.zxingscanner;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.LinearLayout;
import android.widget.FrameLayout.LayoutParams;

import com.covics.zxingscanner.ScannerView;

import com.covics.zxingscanner.R;

//activity需要实现com.covics.zxingscanner.OnDecodeCompletionListener接口
public class ZXingScannerActivity extends Activity implements OnDecodeCompletionListener{
	private ScannerView scannerView;
	private TextView txtResult;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        scannerView=(ScannerView)findViewById(R.id.scanner_view);
		txtResult = (TextView) findViewById(R.id.txtResult);
		//条码扫描后回调自己的onDecodeCompletion
		scannerView.setOnDecodeListener(this);		
    }
    
    //将条码扫描识别结果打印在textview上,barcodeFormat是条码格式,barcode是条码内容,bitmap是条码图像
    @Override
	public void onDecodeCompletion(String barcodeFormat,String barcode,Bitmap bitmap){
		txtResult.setText("Barcode Format:"+barcodeFormat+"  Barcode:"+barcode);
		
	}
    
    @Override
	protected void onResume() {
		super.onResume();
		//onResume时才打开相机和闪光灯
		scannerView.onResume();
	}
    
    @Override
	protected void onPause() {
		super.onPause();	
		//onPause时关闭相机和闪光灯
		scannerView.onPause();
		
	}

	@Override
	protected void onDestroy() {		
			
		super.onDestroy();
	}
}

使用上就这么简单。


下面简单介绍一下ScannerView的实现原理。它扩展自FrameLayout,里面加入了一个SurfaceView和另一个扩展的View(ViewfinderView)。

SurfaceView用于显示相机的图像,通过将SurfaceView的surfaceholder传入相机对象,就能将相机的图像显示出来。

而ViewfinderView则是覆盖在SurfaceView上面,通过onDraw方法,画出中间一个框是全透明,其余区域是半透明的效果,让用户明白,通过中间全透明框取景。

扫描的原理:

CaptureActivityHandler作为一个 handler,不断让相机自动对焦,并驱动相机获取preview图像,一旦获得preview图像,就传入给独立线程DecodeThread的handler,有该handler负责将取景框部分的图像获取后,调用Zxing进行解码,如果解码成功,则通知ScannerView,将结果传给实现了OnDecodeCompletionListener接口的对象。


其实这源代码我也是拿别人的做了一些改动,解决了横屏和竖屏的问题。

Zxing的简化代码是从这篇网文获取的:条码扫描二维码扫描——ZXing android 源码简化 感谢作者。


这里居然没法上传附件。所以,如果需要下载源代码的话,请访问我的另外一个博客。51CTO的博客



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值