1. 程式人生 > >android利用zbar二維碼掃描

android利用zbar二維碼掃描

原始碼下載

之前用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);
	}
}

2.掃描的activity
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;
		}
	}
}


相關推薦

android利用zbar掃描

原始碼下載 之前用zxing做開發,各種奇葩問題,橫屏修等等,而且效能也不搞。被測試批了,沒辦法後來換了zbar。效能好多了。 /*********************重要更新*******************************/ 有朋友提到兩個問題: 1.

Android 基於Zxing掃描的光速實現

Android 十分鐘光速實現二維碼掃描 前言 在專案中要使用到二維碼的相關內容,我們第一時間想到的是使用大名鼎鼎的zxing或者ZBar開源框架: 除了這兩個有名的框架之外,還有@bingoogolapple大神的掃描庫 以及國外@dlaz

ubuntu安裝zbar掃描

wget http://downloads.sourceforge.NET/project/zbar/zbar/0.10/zbar-0.10.tar.gz 1. tar -zvxf zbar-0.10.

Android開發之Zbar實現掃描功能

前言: 在寫這篇文章之前已經寫過兩篇關於二維碼功能的文章,有興趣的可以看看——》文章1:Android開發之利用ZXing庫實現二維碼的掃描;文章2:Android開發之利用ZXing庫實現二維碼的生成,這兩篇文章中使用到的二維碼生成庫是ZXing,在本篇

ZBar 是款桌面電腦用條形碼/掃描工具

進行 output app 新版本 import 系統安裝 安裝文件 window eating ZBar 是款桌面電腦用條形碼/二維碼掃描工具 windows平臺python 2.7環境編譯安裝zbar 最近一個項目需要識別二維碼,找來找去找到了zbar和zxin

Android 基於google Zxing實現 條形碼掃描,仿微信掃描效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android掃描庫zxing的使用

Android二維碼的使用: 1.匯入依賴: compile 'com.journeyapps:zxing-android-embedded:3.3.0' 2.建立ScannerAcvitity,在佈局中使用以下控制元件: <com.journeyapps.

Android掃描與產生模組

第一步:將libzxing Modile匯入專案中 點選OK,然後點選File——Structure——專案名——dependencies——libzxing——OK 這樣我們的依賴關係就建立好了; 第二步:介面,activity_main.xml <

Android之在Fragment中使用掃描功能

最近在做一個專案,是在Fragment中使用zxing的二維碼掃描功能,在我以前寫的二維碼掃描功能的教程只適合在activity中使用地址:https://blog.csdn.net/qq_31844349/article/details/81301911 沒有辦法因為工作需要,必須在Fra

掃描 ZBar基礎

第一步、加依賴 implementation 'cn.bingoogolapple:bga-qrcode-zbar:1.2.1'或 implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1' 第二步、新增許可權

掃描之zxing與zbar

二維碼掃描在日常的使用中非常廣泛,特總結一波,並比較zxing與zbar的優劣之處 zxing與zbar對比: 1.zxing是谷歌開源,專案地址為:https://github.com/zxing/zxing,仍在維護,採用C++編寫。zbar則是主要用C來寫的,速度極快

Xamarin.Android-用ZXing實現掃描以及連續掃描

一、前言 本文的內容有兩個基礎:ZXing.Net和ZXing.Net.Mobile ZXing.Net:ZXing的C#實現,主要封裝了各種二維碼的編碼、解碼等跨平臺的演算法 ZXing.Net.Mobile:對ZXing.Net在xamarin的應用進行了封裝,主要實現了攝像頭掃描、掃描view、掃

Android實現掃描功能(三)-閃光燈控制

簡介 本篇我們對光線暗淡情況下閃光燈的使用做出介紹。 效果 晚上測試時: 開燈後: 未開燈: 實現步驟 1、在activity_scanner.xml介面上加上閃光燈開關按鈕。可以是Button、Checkbox等控制元件。

opencv+zbar檢測及掃描

通過子函式zbar_find()檢測圖片中二維碼的位置並用矩形框標出 通過zbar_detect()函式呼叫zbar庫對Roi進行掃描,並輸出掃描結果 因為圖片中二維碼數目多,且二維碼分佈有一定規律(均在圖片下部,類似於書櫃中書籍排列),所以採用擷取圖片中roi傳遞給子函式

Android 基於Zxing的掃描優化

最近公司專案App中要整合二維碼掃描來適應在戶外工作的時候,對碼頭集裝箱等上面貼的A4紙張列印的二維碼進行識別, 一般App二維碼整合後,能掃出來就不管了,但是我們在整合成功後,根據使用者反饋,在戶外的環境下,很多二維碼識別不了,或者識別速度慢,我們自己也是適用了一下,發現也確實是這樣. &nb

Android掃描開發(一):實現思路與原理

【 回覆“ 1024 ”,送你一個特別推送 】 現在二維碼已經非常普及了,那麼二維碼的掃描與處理也成為了Android開發中的一個必要技能。網上有很多關於Android中二維碼處理的帖子,大都是在講開源框架zxing用法,然後貼貼程式碼就完了,並沒有一個系統的分析和

Android實現掃描登入網頁

    之前寫過一個二維碼掃描demo,用的Zxing的框架,點選下載,後續掃描二維碼中出現一些問題,比如解決壓縮圖片,調整掃描視窗大小等等。後續單位要求做掃描登入實現,發現難點就是怎麼知道你掃描的是

在沒有個人/公司網站的情況下,如何利用同一個自動識別手機系統(Android/IOS)跳轉不同下載頁面

一、使用場景 開發了一款App,包括iOS及Android版,到了推廣階段,準備生成二維碼讓使用者掃碼下載,那這個二維碼該怎麼生成?iOS及Andorid各自生成一個二維碼讓使用者區分下載?當然這種方式是可行的,但卻增加了使用者的使用成本!那是不是有一種方式可

ionic3 掃描外掛 (Barcode Scanner 和 Zbar和 QR Scanner)的戰鬥

三款ionic的掃描外掛。 各大部落格都有他們的介紹,我也不想贅述多少。 總結了下各大博主說的,反正是好壞都有,我給各位列個表格自己判斷吧 Barcode Scanner 速度慢,樣式機會為零 Zbar 速度快,ios樣式幾乎為零(槽點:連文字和木紋

Android 基於google Zxing實現、條形碼掃描,仿微信掃描效果(現在正做個掃描App、收藏)

瞭解二維碼這個東西還是從微信中,當時微信推出二維碼掃描功能,自己感覺挺新穎的,從一張圖片中掃一下竟然能直接加好友,不可思議啊,那時候還不瞭解二維碼,呵呵,然後做專案的時候,老闆說要加上二維碼掃描功能,然後自己的屁顛屁顛的去百度,google啥的,發現很多朋友都