源码下载
之前用zxing做开发,各种奇葩问题,横屏修等等,而且性能也不搞。被测试批了,没办法后来换了zbar。性能好多了。
/*********************重要更新*******************************/
有朋友提到两个问题:
1.扫描框目前只是做的假象,是全屏的图片进行解析
2.中文乱码现象
以上两个问题已经得到解决,在下一篇博文中修改
/*************************/
直接上图,看看效果
2.界面上的查找框
/** * 2014-7-15 上午11:14:21 * Created By niexiaoqiang */ package com.example.qu; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; /** * 查找框 * @author niexiaoqiang */ public class FinderView extends View { private static final long ANIMATION_DELAY = 30; private Paint finderMaskPaint; private int measureedWidth; private int measureedHeight; public FinderView(Context context) { super(context); init(context); } public FinderView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawRect(leftRect, finderMaskPaint); canvas.drawRect(topRect, finderMaskPaint); canvas.drawRect(rightRect, finderMaskPaint); canvas.drawRect(bottomRect, finderMaskPaint); //画框 zx_code_kuang.setBounds(middleRect); zx_code_kuang.draw(canvas); if (lineRect.bottom < middleRect.bottom) { zx_code_line.setBounds(lineRect); lineRect.top = lineRect.top + lineHeight / 2; lineRect.bottom = lineRect.bottom + lineHeight / 2; } else { lineRect.set(middleRect); lineRect.bottom = lineRect.top + lineHeight; zx_code_line.setBounds(lineRect); } zx_code_line.draw(canvas); postInvalidateDelayed(ANIMATION_DELAY, middleRect.left, middleRect.top, middleRect.right, middleRect.bottom); } private Rect topRect = new Rect(); private Rect bottomRect = new Rect(); private Rect rightRect = new Rect(); private Rect leftRect = new Rect(); private Rect middleRect = new Rect(); private Rect lineRect = new Rect(); private Drawable zx_code_kuang; private Drawable zx_code_line; private int lineHeight; private void init(Context context) { int finder_mask = context.getResources().getColor(R.color.finder_mask); finderMaskPaint = new Paint(Paint.ANTI_ALIAS_FLAG); finderMaskPaint.setColor(finder_mask); zx_code_kuang = context.getResources().getDrawable(R.drawable.zx_code_kuang); zx_code_line = context.getResources().getDrawable(R.drawable.zx_code_line); lineHeight = 30; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measureedWidth = MeasureSpec.getSize(widthMeasureSpec); measureedHeight = MeasureSpec.getSize(heightMeasureSpec); int borderWidth = measureedWidth / 2 + 100; middleRect.set((measureedWidth - borderWidth) / 2, (measureedHeight - borderWidth) / 2, (measureedWidth - borderWidth) / 2 + borderWidth, (measureedHeight - borderWidth) / 2 + borderWidth); lineRect.set(middleRect); lineRect.bottom = lineRect.top + lineHeight; leftRect.set(0, middleRect.top, middleRect.left, middleRect.bottom); topRect.set(0, 0, measureedWidth, middleRect.top); rightRect.set(middleRect.right, middleRect.top, measureedWidth, middleRect.bottom); bottomRect.set(0, middleRect.bottom, measureedWidth, measureedHeight); } }
package com.example.qu; import net.sourceforge.zbar.Config; import net.sourceforge.zbar.Image; import net.sourceforge.zbar.ImageScanner; import net.sourceforge.zbar.Symbol; import net.sourceforge.zbar.SymbolSet; import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.PreviewCallback; import android.hardware.Camera.Size; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MainActivity extends Activity implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceHolder mHolder; private SurfaceView surface_view; private ImageScanner scanner; private Handler autoFocusHandler; private AsyncDecode asyncDecode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_zbar_finder); init(); } private void init() { surface_view = (SurfaceView) findViewById(R.id.surface_view); mHolder = surface_view.getHolder(); mHolder.addCallback(this); scanner = new ImageScanner(); scanner.setConfig(0, Config.X_DENSITY, 3); scanner.setConfig(0, Config.Y_DENSITY, 3); autoFocusHandler = new Handler(); asyncDecode = new AsyncDecode(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (mHolder.getSurface() == null) { return; } try { mCamera.stopPreview(); } catch (Exception e) { } try { mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(mHolder); mCamera.setPreviewCallback(previewCallback); mCamera.startPreview(); mCamera.autoFocus(autoFocusCallback); } catch (Exception e) { Log.d("DBG", "Error starting camera preview: " + e.getMessage()); } } /** * 预览数据 */ PreviewCallback previewCallback = new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { if (asyncDecode.isStoped()) { Camera.Parameters parameters = camera.getParameters(); Size size = parameters.getPreviewSize(); Image barcode = new Image(size.width, size.height, "Y800"); barcode.setData(data); asyncDecode = new AsyncDecode(); asyncDecode.execute(barcode); } } }; private class AsyncDecode extends AsyncTask<Image, Void, Void> { private boolean stoped = true; @Override protected Void doInBackground(Image... params) { stoped = false; Image barcode = params[0]; int result = scanner.scanImage(barcode); if (result != 0) { // mCamera.setPreviewCallback(null); // mCamera.stopPreview(); SymbolSet syms = scanner.getResults(); System.out.println(syms); for (Symbol sym : syms) { Log.d("xiaoqiang", sym.getData()); } } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); stoped = true; } public boolean isStoped() { return stoped; } } /** * 自动对焦回调 */ AutoFocusCallback autoFocusCallback = new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { autoFocusHandler.postDelayed(doAutoFocus, 1000); } }; //自动对焦 private Runnable doAutoFocus = new Runnable() { public void run() { if (null == mCamera || null == autoFocusCallback) { return; } mCamera.autoFocus(autoFocusCallback); } }; @Override public void surfaceCreated(SurfaceHolder holder) { try { mCamera = Camera.open(); } catch (Exception e) { mCamera = null; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } } }