Android上使用ZXing识别条形码与二维码的方法

Android上使⽤ZXing识别条形码与⼆维码的⽅法
⽬前有越来越多的⼿机具备⾃动对焦的拍摄功能,这也意味着这些⼿机可以具备条码扫描的功能。⼿机具备条码扫描的功能,可以优化购物流程,快速存储电⼦名⽚(⼆维码)等。
本⽂所述实例就使⽤了ZXing 1.6实现条码/⼆维码识别。ZXing是个很经典的条码/⼆维码识别的开源类库,早在很久以前,就有开发者在J2ME上使⽤ZXing了,只不过需要⽀持JSR-234规范(⾃动对焦)的⼿机才能发挥其威⼒,⽽⽬前已经有不少Android⼿机具备⾃动对焦的功能。
本⽂代码运⾏的结果如下,使⽤91⼿机助⼿截图时,⽆法截取SurfaceView的实时图像:
本⽂使⽤了ZXing1.6的core,即把/zxing-1.6/core/下的src复制覆盖⼯程的src;另外还要使⽤到/zxing-1.6/android/下的PlanarYUVLuminanceSource.java。
十六大报告此处需要注意:/zxing-1.6/android/ 是BarcodeScanner的源码,本⽂程序相当于BarcodeScanner的精简版,只保留最基本的识别功能。
本⽂完整源码点击此处。
源码⽬录结果如下图,ChecksumException.java下⾯还有很多源⽂件,截图尚未列出:
本⽂例⼦必须要开摄像头和⾃动对焦的权限,不然启动时会报异常,所⽤的权限如下:
<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" />
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/FrameLayout01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="schemas.android/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=""
android:id="@+id/txtScanResult" android:textColor="#FF000000"></TextView>
</RelativeLayout>
</FrameLayout>
testCamera.java是主类,负责控制Camera和对图像做解码,源码如下:
stCamera;
import java.util.Timer;
import java.util.TimerTask;
大稿国际艺术区le.zxing.BinaryBitmap;
le.zxing.MultiFormatReader;
le.zxing.Result;
le.zxing.Android.PlanarYUVLuminanceSource;
le.zxingmon.HybridBinarizer;
import android.app.Activity;
aphics.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) {
setContentView(R.layout.main);
this.setTitle("Android条码/⼆维码识别Demo-----hellogv");
imgView = (ImageView) this.findViewById(R.id.ImageView01);
centerView = (View) this.findViewById(View);
sfvCamera = (SurfaceView) this.findViewById(R.id.sfvCamera);
sfhCamera = new Holder(), width, height,
previewCallback);
txtScanResult=(TextView)this.findViewById(ScanResult);
// 初始化定时器
mTimer = new Timer();
mTimerTask = new MyTimerTask();
mTimer.schedule(mTimerTask, 0, 80);
}
class MyTimerTask extends TimerTask {
@Override
public void run() {
if (dstLeft == 0) {//只赋值⼀次
dstLeft = Left() * width
/
getWindowManager().getDefaultDisplay().getWidth();
dstTop = Top() * height
/ getWindowManager().getDefaultDisplay().getHeight();
dstWidth = (Right() - Left())* width
/ getWindowManager().getDefaultDisplay().getWidth();
dstHeight = (Bottom() - Top())* 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);
//取得灰度图
Bitmap mBitmap = derCroppedGreyscaleBitmap();
//显⽰灰度图
imgView.setImageBitmap(mBitmap);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
MultiFormatReader reader = new MultiFormatReader();
try {
Result result = reader.decode(bitmap);
String strResult = "BarcodeFormat:"
+ BarcodeFormat().toString() + " text:"
+ Text();
txtScanResult.setText(strResult);
} catch (Exception e) {
txtScanResult.setText("Scanning");
}
}
};
}
SFHCamera.java是Camera控制类,源码如下:
stCamera;
import java.io.IOException;
aphics.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 = Parameters();
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 = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();//停⽌预览
mCamera = null;
Log.e("Camera","surfaceDestroyed");
}
/**
* ⾃动对焦并回调Camera.PreviewCallback
*/
public void AutoFocusAndPreviewCallback()
dietmp3
{
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类调⽤。
PS:本站还提供了⼀个功能⾮常强⼤的⼆维码⽣成⼯具,感兴趣的朋友可以参考⼀下:
希望本⽂实例对⼤家学习Android程序设计能有所帮助。

本文发布于:2024-09-22 18:29:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/144605.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:功能   对焦   条码   源码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议