在Android上使用ZXing識別條碼/二維碼

來源:互聯網
上載者:User

越來越多的手機具備自動對焦的拍攝功能,這也意味著這些手機可以具備條碼掃描的功能.......手機具備條碼掃描的功能,可以最佳化購物流程,快速儲存電子名片(二維碼)等

      本文使用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;</p><p>import java.util.Timer;<br />import java.util.TimerTask;<br />import com.google.zxing.BinaryBitmap;<br />import com.google.zxing.MultiFormatReader;<br />import com.google.zxing.Result;<br />import com.testbarcode.android.PlanarYUVLuminanceSource;<br />import com.google.zxing.common.HybridBinarizer;<br />import android.app.Activity;<br />import android.graphics.Bitmap;<br />import android.hardware.Camera;<br />import android.os.Bundle;<br />import android.view.SurfaceView;<br />import android.view.View;<br />import android.widget.ImageView;<br />import android.widget.TextView;<br />public class testCamera extends Activity {<br /> /** Called when the activity is first created. */<br /> private SurfaceView sfvCamera;<br /> private SFHCamera sfhCamera;<br /> private ImageView imgView;<br /> private View centerView;<br /> private TextView txtScanResult;<br /> private Timer mTimer;<br /> private MyTimerTask mTimerTask;<br /> // 按照標準HVGA<br /> final static int width = 480;<br /> final static int height = 320;<br /> int dstLeft, dstTop, dstWidth, dstHeight;<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> this.setTitle("Android條碼/二維碼識別Demo-----hellogv");<br /> imgView = (ImageView) this.findViewById(R.id.ImageView01);<br /> centerView = (View) this.findViewById(R.id.centerView);<br /> sfvCamera = (SurfaceView) this.findViewById(R.id.sfvCamera);<br /> sfhCamera = new SFHCamera(sfvCamera.getHolder(), width, height,<br /> previewCallback);<br /> txtScanResult=(TextView)this.findViewById(R.id.txtScanResult);<br /> // 初始化定時器<br /> mTimer = new Timer();<br /> mTimerTask = new MyTimerTask();<br /> mTimer.schedule(mTimerTask, 0, 80);<br /> } </p><p> class MyTimerTask extends TimerTask {<br /> @Override<br /> public void run() {<br /> if (dstLeft == 0) {//只賦值一次<br /> dstLeft = centerView.getLeft() * width<br /> / getWindowManager().getDefaultDisplay().getWidth();<br /> dstTop = centerView.getTop() * height<br /> / getWindowManager().getDefaultDisplay().getHeight();<br /> dstWidth = (centerView.getRight() - centerView.getLeft())* width<br /> / getWindowManager().getDefaultDisplay().getWidth();<br /> dstHeight = (centerView.getBottom() - centerView.getTop())* height<br /> / getWindowManager().getDefaultDisplay().getHeight();<br /> }<br /> sfhCamera.AutoFocusAndPreviewCallback();<br /> }<br /> }<br /> /**<br /> * 自動對焦後輸出圖片<br /> */<br /> private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {<br /> @Override<br /> public void onPreviewFrame(byte[] data, Camera arg1) {<br /> //取得指定範圍的幀的資料<br /> PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(<br /> data, width, height, dstLeft, dstTop, dstWidth, dstHeight,false);<br /> //取得灰階圖<br /> Bitmap mBitmap = source.renderCroppedGreyscaleBitmap();<br /> //顯示灰階圖<br /> imgView.setImageBitmap(mBitmap);<br /> BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));<br /> MultiFormatReader reader = new MultiFormatReader();<br /> try {<br /> Result result = reader.decode(bitmap);<br /> String strResult = "BarcodeFormat:"<br /> + result.getBarcodeFormat().toString() + " text:"<br /> + result.getText();<br /> txtScanResult.setText(strResult);<br /> } catch (Exception e) {<br /> txtScanResult.setText("Scanning");<br /> }<br /> }<br /> };<br />}<br />

 SFHCamera.java是Camera控制類,源碼如下:

 

Java代碼package com.testbarcode.android;</p><p>import java.io.IOException;<br />import android.graphics.PixelFormat;<br />import android.hardware.Camera;<br />import android.util.Log;<br />import android.view.SurfaceHolder;<br />public class SFHCamera implements SurfaceHolder.Callback{<br /> private SurfaceHolder holder = null;<br /> private Camera mCamera;<br /> private int width,height;<br /> private Camera.PreviewCallback previewCallback; </p><p> public SFHCamera(SurfaceHolder holder,int w,int h,Camera.PreviewCallback previewCallback) {<br /> this.holder = holder;<br /> this.holder.addCallback(this);<br /> this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);<br /> width=w;<br /> height=h;<br /> this.previewCallback=previewCallback;<br /> } </p><p> @Override<br /> public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {<br /> Camera.Parameters parameters = mCamera.getParameters();<br /> parameters.setPreviewSize(width, height);//設定尺寸<br /> parameters.setPictureFormat(PixelFormat.JPEG);<br /> mCamera.setParameters(parameters);<br /> mCamera.startPreview();//開始預覽<br /> Log.e("Camera","surfaceChanged");<br /> }<br /> @Override<br /> public void surfaceCreated(SurfaceHolder arg0) {<br /> mCamera = Camera.open();//啟動服務<br /> try {<br /> mCamera.setPreviewDisplay(holder);//設定預覽<br /> Log.e("Camera","surfaceCreated");<br /> } catch (IOException e) {<br /> mCamera.release();//釋放<br /> mCamera = null;<br /> } </p><p> }<br /> @Override<br /> public void surfaceDestroyed(SurfaceHolder arg0) {<br /> mCamera.setPreviewCallback(null);<br /> mCamera.stopPreview();//停止預覽<br /> mCamera = null;<br /> Log.e("Camera","surfaceDestroyed");<br /> }<br /> /**<br /> * 自動對焦並回調Camera.PreviewCallback<br /> */<br /> public void AutoFocusAndPreviewCallback()<br /> {<br /> if(mCamera!=null)<br /> mCamera.autoFocus(mAutoFocusCallBack);<br /> } </p><p> /**<br /> * 自動對焦<br /> */<br /> private Camera.AutoFocusCallback mAutoFocusCallBack = new Camera.AutoFocusCallback() { </p><p> @Override<br /> public void onAutoFocus(boolean success, Camera camera) {<br /> if (success) { //對焦成功,回調Camera.PreviewCallback<br /> mCamera.setOneShotPreviewCallback(previewCallback);<br /> }<br /> }<br /> }; </p><p>} </p><p>

 

 其中testCamera.java的Camera.PreviewCallback previewCallback 是整個程式的邏輯核心,作為回呼函數給SFHCamera.java的內部Camera類調用。

 

 

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

這篇文章轉自javaeye(http://17zouguo.javaeye.com/blog/857349),程式運行起來效果不是很好,還需改進。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.