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啥的,發現很多朋友都