在Android上使用ZXing识别条码/二维码

本文介绍如何使用ZXing 1.6库实现Android平台上的条码和二维码识别功能。通过具体的代码示例,展示了如何集成ZXing库,并实现自动对焦及条码扫描等功能。

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

越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等

本文使用ZXing 1.6实现条码/二维码识别。ZXing是个很经典的条码/二维码识别的开源类库,long long ago,就有开发者在J2ME上使用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力,而目前已经有不少Android手机具备自动对焦的功能。

本文代码运行的结果如下,使用91手机助手截图时,无法截取SurfaceView的实时图像:

本文使用了ZXing1.6的core,即把/zxing-1.6/core/下的src复制覆盖工程的src;另外还要使用到/zxing-1.6/android/下的PlanarYUVLuminanceSource.java。

PS:/zxing-1.6/android/ 是BarcodeScanner的源码,本文程序相当于BarcodeScanner的精简版,只保留最基本的识别功能。

源码目录结果如下图,ChecksumException.java下面还有很多源文件,截图尚未列出:

main.xml源码如下,main.xml必须要用到FrameLayout才能重叠控件实现“范围框”的效果:

Xml代码
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/FrameLayout01"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	xmlns:android="http://schemas.android.com/apk/res/android">
	<SurfaceView android:layout_height="fill_parent"
		android:id="@+id/sfvCamera" android:layout_width="fill_parent">
	</SurfaceView>
	<RelativeLayout android:id="@+id/RelativeLayout01"
		android:layout_height="fill_parent"
		android:layout_width="fill_parent">
		<ImageView android:id="@+id/ImageView01"
			android:layout_height="100dip" android:layout_width="160dip">
		</ImageView>
		<View android:layout_centerVertical="true"
			android:layout_centerHorizontal="true" android:layout_width="300dip"
			android:background="#55FF6666" android:id="@+id/centerView"
			android:layout_height="180dip">
		</View>
		<TextView android:layout_centerHorizontal="true"
			android:layout_width="wrap_content"
			android:layout_below="@+id/centerView"
			android:layout_height="wrap_content" android:text="Scanning..."
			android:id="@+id/txtScanResult" android:textColor="#FF000000">
		</TextView>
	</RelativeLayout>
</FrameLayout>

testCamera.java是主类,负责控制Camera和对图像做解码,源码如下:

Java代码
package com.testbarcode.android; import java.util.Timer; import java.util.TimerTask; import com.google.zxing.BinaryBitmap; import com.google.zxing.MultiFormatReader; import com.google.zxing.Result; import com.testbarcode.android.PlanarYUVLuminanceSource; import com.google.zxing.common.HybridBinarizer; import android.app.Activity; import android.graphics.Bitmap; import android.hardware.Camera; import android.os.Bundle; import android.view.SurfaceView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class testCamera extends Activity { /** Called when the activity is first created. */ private SurfaceView sfvCamera; private SFHCamera sfhCamera; private ImageView imgView; private View centerView; private TextView txtScanResult; private Timer mTimer; private MyTimerTask mTimerTask; // 按照标准HVGA final static int width = 480; final static int height = 320; int dstLeft, dstTop, dstWidth, dstHeight; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle("Android条码/二维码识别Demo-----hellogv"); imgView = (ImageView) this.findViewById(R.id.ImageView01); centerView = (View) this.findViewById(R.id.centerView); sfvCamera = (SurfaceView) this.findViewById(R.id.sfvCamera); sfhCamera = new SFHCamera(sfvCamera.getHolder(), width, height, previewCallback); txtScanResult=(TextView)this.findViewById(R.id.txtScanResult); // 初始化定时器 mTimer = new Timer(); mTimerTask = new MyTimerTask(); mTimer.schedule(mTimerTask, 0, 80); } class MyTimerTask extends TimerTask { @Override public void run() { if (dstLeft == 0) {//只赋值一次 dstLeft = centerView.getLeft() * width / getWindowManager().getDefaultDisplay().getWidth(); dstTop = centerView.getTop() * height / getWindowManager().getDefaultDisplay().getHeight(); dstWidth = (centerView.getRight() - centerView.getLeft())* width / getWindowManager().getDefaultDisplay().getWidth(); dstHeight = (centerView.getBottom() - centerView.getTop())* height / getWindowManager().getDefaultDisplay().getHeight(); } sfhCamera.AutoFocusAndPreviewCallback(); } } /** * 自动对焦后输出图片 */ private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera arg1) { //取得指定范围的帧的数据 PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource( data, width, height, dstLeft, dstTop, dstWidth, dstHeight,false); //取得灰度图 Bitmap mBitmap = source.renderCroppedGreyscaleBitmap(); //显示灰度图 imgView.setImageBitmap(mBitmap); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); MultiFormatReader reader = new MultiFormatReader(); try { Result result = reader.decode(bitmap); String strResult = "BarcodeFormat:" + result.getBarcodeFormat().toString() + " text:" + result.getText(); txtScanResult.setText(strResult); } catch (Exception e) { txtScanResult.setText("Scanning"); } } }; }

SFHCamera.java是Camera控制类,源码如下:

Java代码
package com.testbarcode.android; import java.io.IOException; import android.graphics.PixelFormat; import android.hardware.Camera; import android.util.Log; import android.view.SurfaceHolder; public class SFHCamera implements SurfaceHolder.Callback{ private SurfaceHolder holder = null; private Camera mCamera; private int width,height; private Camera.PreviewCallback previewCallback; public SFHCamera(SurfaceHolder holder,int w,int h,Camera.PreviewCallback previewCallback) { this.holder = holder; this.holder.addCallback(this); this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); width=w; height=h; this.previewCallback=previewCallback; } @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();//开始预览 Log.e("Camera","surfaceChanged"); } @Override public void surfaceCreated(SurfaceHolder arg0) { mCamera = Camera.open();//启动服务 try { mCamera.setPreviewDisplay(holder);//设置预览 Log.e("Camera","surfaceCreated"); } catch (IOException e) { mCamera.release();//释放 mCamera = null; } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { mCamera.setPreviewCallback(null); mCamera.stopPreview();//停止预览 mCamera = null; Log.e("Camera","surfaceDestroyed"); } /** * 自动对焦并回调Camera.PreviewCallback */ public void AutoFocusAndPreviewCallback() { if(mCamera!=null) mCamera.autoFocus(mAutoFocusCallBack); } /** * 自动对焦 */ private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { //对焦成功,回调Camera.PreviewCallback mCamera.setOneShotPreviewCallback(previewCallback); } } }; }

其中testCamera.java的Camera.PreviewCallback previewCallback是整个程序的逻辑核心,作为回调函数给SFHCamera.java的内部Camera类调用。

---------------------------------

这篇文章转自javaeye(http://17zouguo.javaeye.com/blog/857349),程序运行起来效果不是很好,还需改进。

Files contained in zxing-1.6-core.jar: META-INF/MANIFEST.MF com.google.zxing.BarcodeFormat.class com.google.zxing.Binarizer.class com.google.zxing.BinaryBitmap.class com.google.zxing.ChecksumException.class com.google.zxing.DecodeHintType.class com.google.zxing.EncodeHintType.class com.google.zxing.FormatException.class com.google.zxing.LuminanceSource.class com.google.zxing.MultiFormatReader.class com.google.zxing.MultiFormatWriter.class com.google.zxing.NotFoundException.class com.google.zxing.Reader.class com.google.zxing.ReaderException.class com.google.zxing.Result.class com.google.zxing.ResultMetadataType.class com.google.zxing.ResultPoint.class com.google.zxing.ResultPointCallback.class com.google.zxing.Writer.class com.google.zxing.WriterException.class com.google.zxing.client.result.AbstractDoCoMoResultParser.class com.google.zxing.client.result.AddressBookAUResultParser.class com.google.zxing.client.result.AddressBookDoCoMoResultParser.class com.google.zxing.client.result.AddressBookParsedResult.class com.google.zxing.client.result.BizcardResultParser.class com.google.zxing.client.result.BookmarkDoCoMoResultParser.class com.google.zxing.client.result.CalendarParsedResult.class com.google.zxing.client.result.EmailAddressParsedResult.class com.google.zxing.client.result.EmailAddressResultParser.class com.google.zxing.client.result.EmailDoCoMoResultParser.class com.google.zxing.client.result.ExpandedProductParsedResult.class com.google.zxing.client.result.ExpandedProductResultParser.class com.google.zxing.client.result.GeoParsedResult.class com.google.zxing.client.result.GeoResultParser.class com.google.zxing.client.result.ISBNParsedResult.class com.google.zxing.client.result.ISBNResultParser.class com.google.zxing.client.result.ParsedResult.class com.google.zxing.client.result.ParsedResultType.class com.google.zxing.client.result.ProductParsedResult.class com.google.zxing.client.result.ProductResultParser.class com.google.zxing.client.result.ResultParser.class com.google.zxing.client.result.SMSMMSResultParser.class com.google.zxing.client.result.SMSParsedResult.class com.google.zxing.client.result.SMSTOMMSTOResultParser.class com.google.zxing.client.result.TelParsedResult.class com.google.zxing.client.result.TelResultParser.class com.google.zxing.client.result.TextParsedResult.class com.google.zxing.client.result.URIParsedResult.class com.google.zxing.client.result.URIResultParser.class com.google.zxing.client.result.URLTOResultParser.class com.google.zxing.client.result.VCardResultParser.class com.google.zxing.client.result.VEventResultParser.class com.google.zxing.client.result.WifiParsedResult.class com.google.zxing.client.result.WifiResultParser.class com.google.zxing.client.result.optional.AbstractNDEFResultParser.class com.google.zxing.client.result.optional.NDEFRecord.class com.google.zxing.client.result.optional.NDEFSmartPosterParsedResult.class com.google.zxing.client.result.optional.NDEFSmartPosterResultParser.class com.google.zxing.client.result.optional.NDEFTextResultParser.class com.google.zxing.client.result.optional.NDEFURIResultParser.class com.google.zxing.common.BitArray.class com.google.zxing.common.BitMatrix.class com.google.zxing.common.BitSource.class com.google.zxing.common.CharacterSetECI.class com.google.zxing.common.Collections.class com.google.zxing.common.Comparator.class com.google.zxing.common.DecoderResult.class com.google.zxing.common.DefaultGridSampler.class com.google.zxing.common.DetectorResult.class com.google.zxing.common.ECI.class com.google.zxing.common.GlobalHistogramBinarizer.class com.google.zxing.common.GridSampler.class com.google.zxing.common.HybridBinarizer.class com.google.zxing.common.PerspectiveTransform.class com.google.zxing.common.StringUtils.class com.google.zxing.common.detector.MonochromeRectangleDetector.class com.google.zxing.common.detector.WhiteRectangleDetector.class com.google.zxing.common.reedsolomon.GF256.class com.google.zxing.common.reedsolomon.GF256Poly.class com.google.zxing.common.reedsolomon.ReedSolomonDecoder.class com.google.zxing.common.reedsolomon.ReedSolomonEncoder.class com.google.zxing.common.reedsolomon.ReedSolomonException.class com.google.zxing.datamatrix.DataMatrixReader.class com.google.zxing.datamatrix.decoder.BitMatrixParser.class com.google.zxing.datamatrix.decoder.DataBlock.class com.google.zxing.datamatrix.decoder.DecodedBitStreamParser.class com.google.zxing.datamatrix.decoder.Decoder.class com.google.zxing.datamatrix.decoder.Version.class com.google.zxing.datamatrix.detector.Detector.class com.google.zxing.multi.ByQuadrantReader.class com.google.zxing.multi.GenericMultipleBarcodeReader.class com.google.zxing.multi.MultipleBarcodeReader.class com.google.zxing.multi.qrcode.QRCodeMultiReader.class com.google.zxing.multi.qrcode.detector.MultiDetector.class com.google.zxing.multi.qrcode.detector.MultiFinderPatternFinder.class com.google.zxing.oned.CodaBarReader.class com.google.zxing.oned.Code128Reader.class com.google.zxing.oned.Code128Writer.class com.google.zxing.oned.Code39Reader.class com.google.zxing.oned.Code39Writer.class com.google.zxing.oned.Code93Reader.class com.google.zxing.oned.EAN13Reader.class com.google.zxing.oned.EAN13Writer.class com.google.zxing.oned.EAN8Reader.class com.google.zxing.oned.EAN8Writer.class com.google.zxing.oned.EANManufacturerOrgSupport.class com.google.zxing.oned.ITFReader.class com.google.zxing.oned.ITFWriter.class com.google.zxing.oned.MultiFormatOneDReader.class com.google.zxing.oned.MultiFormatUPCEANReader.class com.google.zxing.oned.OneDReader.class com.google.zxing.oned.UPCAReader.class com.google.zxing.oned.UPCEANExtensionSupport.class com.google.zxing.oned.UPCEANReader.class com.google.zxing.oned.UPCEANWriter.class com.google.zxing.oned.UPCEReader.class com.google.zxing.oned.rss.AbstractRSSReader.class com.google.zxing.oned.rss.DataCharacter.class com.google.zxing.oned.rss.FinderPattern.class com.google.zxing.oned.rss.Pair.class com.google.zxing.oned.rss.RSS14Reader.class com.google.zxing.oned.rss.RSSUtils.class com.google.zxing.oned.rss.expanded.BitArrayBuilder.class com.google.zxing.oned.rss.expanded.ExpandedPair.class com.google.zxing.oned.rss.expanded.RSSExpandedReader.class com.google.zxing.oned.rss.expanded.decoders.AI013103decoder.class com.google.zxing.oned.rss.expanded.decoders.AI01320xDecoder.class com.google.zxing.oned.rss.expanded.decoders.AI01392xDecoder.class com.google.zxing.oned.rss.expanded.decoders.AI01393xDecoder.class com.google.zxing.oned.rss.expanded.decoders.AI013x0x1xDecoder.class com.google.zxing.oned.rss.expanded.decoders.AI013x0xDecoder.class com.google.zxing.oned.rss.expanded.decoders.AI01AndOtherAIs.class com.google.zxing.oned.rss.expanded.decoders.AI01decoder.class com.google.zxing.oned.rss.expanded.decoders.AI01weightDecoder.class com.google.zxing.oned.rss.expanded.decoders.AbstractExpandedDecoder.class com.google.zxing.oned.rss.expanded.decoders.AnyAIDecoder.class com.google.zxing.oned.rss.expanded.decoders.BlockParsedResult.class com.google.zxing.oned.rss.expanded.decoders.CurrentParsingState.class com.google.zxing.oned.rss.expanded.decoders.DecodedChar.class com.google.zxing.oned.rss.expanded.decoders.DecodedInformation.class com.google.zxing.oned.rss.expanded.decoders.DecodedNumeric.class com.google.zxing.oned.rss.expanded.decoders.DecodedObject.class com.google.zxing.oned.rss.expanded.decoders.FieldParser.class com.google.zxing.oned.rss.expanded.decoders.GeneralAppIdDecoder.class com.google.zxing.pdf417.PDF417Reader.class com.google.zxing.pdf417.decoder.BitMatrixParser.class com.google.zxing.pdf417.decoder.DecodedBitStreamParser.class com.google.zxing.pdf417.decoder.Decoder.class com.google.zxing.pdf417.detector.Detector.class com.google.zxing.qrcode.QRCodeReader.class com.google.zxing.qrcode.QRCodeWriter.class com.google.zxing.qrcode.decoder.BitMatrixParser.class com.google.zxing.qrcode.decoder.DataBlock.class com.google.zxing.qrcode.decoder.DataMask.class com.google.zxing.qrcode.decoder.DecodedBitStreamParser.class com.google.zxing.qrcode.decoder.Decoder.class com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.class com.google.zxing.qrcode.decoder.FormatInformation.class com.google.zxing.qrcode.decoder.Mode.class com.google.zxing.qrcode.decoder.Version.class com.google.zxing.qrcode.detector.AlignmentPattern.class com.google.zxing.qrcode.detector.AlignmentPatternFinder.class com.google.zxing.qrcode.detector.Detector.class com.google.zxing.qrcode.detector.FinderPattern.class com.google.zxing.qrcode.detector.FinderPatternFinder.class com.google.zxing.qrcode.detector.FinderPatternInfo.class com.google.zxing.qrcode.encoder.BlockPair.class com.google.zxing.qrcode.encoder.ByteMatrix.class com.google.zxing.qrcode.encoder.Encoder.class com.google.zxing.qrcode.encoder.MaskUtil.class com.google.zxing.qrcode.encoder.MatrixUtil.class com.google.zxing.qrcode.encoder.QRCode.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值