安卓掃碼:簡單的ZXing使用記錄

ZXing是Google提供的條形碼、二維碼等的生成、解析的庫。最近工作需求去研究了一下,主要是研究怎麼掃描二維碼(QRCode)。網上教程也不少,但大多看了不明所以,甚至看了半天都不知道解碼到底從哪兒下手。這篇文章僅作爲一個補充,大體講一下使用ZXing的流程,並不涉及具體代碼。其實解碼很簡單的,只要知道大體的步驟,參照Google提供的Android上ZXing使用源碼,很容易就明白。總之,明白關鍵節點後,我只用了幾個類就實現了掃碼器的基本功能。

官方代碼託管在GitHub上https://github.com/zxing/zxing/

  • 我習慣用IDEA+Gradle來開發,所以不喜歡網上那種把jar下載下來導入的方法(而且GitHub裏也沒提供jar包,你得自己下載幾百兆的源碼編譯,或者下載前輩們精簡好的jar包)。查Maven倉庫(jcenter的),果然有現成的庫。那麼第一步,在build.gradle中添加下面兩句依賴:

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.google.zxing:android-core:3.2.1'

    第一句是導入ZXing核心庫core.jar,第二句導入了一個Android的工具類。是的只有一個類,CameraConfigurationUtils,用於相機的配置。編譯gradle,ok。

接下來是使用咯,GitHub源碼很多,隨便翻翻,大致寫幾個關鍵的地方,方便供以後自己以及他人查詢。

  • PlanarYUVLuminanceSource,在core.jar裏,加工相機預覽傳回的byte[] data,得到要解析的source。爲了得到它,可以參考官方GitHub源碼中的Android部分的一個叫做CameraManager的類:https://github.com/zxing/zxing/blob/master/android/src/com/google/zxing/client/android/camera/CameraManager.java,裏面有一個很關鍵的方法

    public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data);
    我是直接照搬了這個方法(以及它要用到的幾個方法)。
  • CameraConfigurationUtils,在android-core.jar裏,之前提到過的。裏面有很多配置相機的工具方法。比如這個:

    public static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution);
    用於把screenResolution轉化成cameraResolution。至於這倆Point類的實例幹嘛的,隨便翻翻基於ZXing的Android掃碼器源碼就知道了。
  • MultiFormatReader,在core.jar裏,解碼器的主要入口,解讀二維碼的關鍵步驟就是這個類的decode();、decodeWithState();方法。第二個需要事先用setHints();方法提供要解析的條碼類型(格式)。倆方法的參數是一張二進制位圖(BinaryBitmap),由PlanarYUVLuminanceSource的實例構建而來(

    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(planarYUVLuminanceSource);
    )。
  • Result,也在core.jar裏,com.google.zxing。作爲MultiFormatReader的decode的返回結果容器。簡單的使用result.getText();就可以獲取到二維碼內的信息。這裏囉嗦幾句,其實二維碼就是數據的一種載體,用一定算法裝載了一些信息,比如一條URL字符串。

OK,就這樣。總結一下解碼過程:

  1. 每隔500ms獲取一次相機預覽傳回的幀圖。

  2. 開個線程,模仿或照搬Google的CameraManager裏buildLuminanceSource();方法,把得到的幀圖加工成PlanarYUVLuminanceSource。參數中會用到CameraConfigurationUtils的findBestPreviewSizeValue方法。

  3. 把(2)中得到的source轉換成二進制位圖,用MultiFormatReader解析它,得到Result結果容器。解碼完成。

這次不放自己的源碼了,GitHub裏已經有很多了,官方的Android工程實例就很好。https://github.com/zxing/zxing/tree/master/android

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章