二維碼掃描開源庫ZXing定製化,開源zxing定製化

來源:互聯網
上載者:User

二維碼掃描開源庫ZXing定製化,開源zxing定製化

(抱歉文章還在修改但是不小心發布了= =)

最近在用ZXing這個開源庫做二維碼的掃描模組,開發過程的一些代碼修改和裁剪的經驗和大家分享一下。

My Code庫:

https://github.com/SickWorm/ZXingDialog

代碼沒有在github維護,所以沒有log。但是所有修改的地方我都加上了“@ch”的注釋,以方便定位

官方源碼:

https://github.com/zxing/zxing

 

實現功能:

1、功能裁剪(只保留QRCode二維碼掃描功能,去掉條碼等其他碼掃描功能)

2、移除資源依賴,提供Dialog形式的掃碼功能

3、API相容(源碼只相容4.0以上,現相容至2.1)

4、轉換為豎屏(源碼為橫屏)

5、掃碼速度最佳化(主要分三點,現只完成了一點)

6、裝置相容(針對低解析度裝置)

本文還會提到:

7、自訂介面

8、最佳化調試方法

 

1、建立工程

ZXing源碼並沒有提供一個完整的執行個體工程給我們使用,構建一個工程我們需要源碼下的三個檔案夾的檔案:

core/

android-core/

android/

大概步驟如下:

1、建立一個新工程

2、把android目錄下的所有檔案覆蓋到新工程(內含有資源檔和AndroidManifest.xml等構建app所需的檔案)

3、把android-core所有Java檔案拷入到src目錄下(注意!android-core中的src檔案夾需要進行一些改動,原來路徑是android-core\src\main\java\com\google\zxing\client\android\camera,我們要把中間的main\java兩層檔案夾去掉,不然在Eclipse中無法識別包路徑)

4、把core目錄下的所有Java檔案拷入到src目錄下(注意!和步驟3一樣需要去掉main\java兩層檔案夾)。這樣ZXing已經可以運行了,我的src目錄是這樣的:

可以直接運行,效果還不錯。如果你遇到一些錯誤,有可能是編譯的JDK版本低於1.7導致的。源碼裡使用了ArrayList<>這樣的寫法,1.7以前是不支援的。你可以選擇修改源碼或者提高編譯JDK版本。

但你可能不滿足於這個介面,掃描框太大了,而且是橫屏全屏的,還要求API 15(Android 4.0.3)。下面我們會對這些需求進行修改。

2、代碼最佳化1、功能裁剪(只保留QRCode二維碼掃描功能,去掉條碼等其他碼掃描功能)

我的目標是只保留二維碼識別,不需要其他多餘的功能。這一部分的步驟我不打算詳細說明,因為我已經不記得了。。大家可以直接看My Code的結果。

可以直接刪掉的是:

com.google.zxing.aztec.**  aztec格式的二維碼

com.google.zxing.client.android.book.*  Google 圖書相關的功能

com.google.zxing.client.android.clickboard.*  不清楚,複製黏貼?

com.google.zxing.client.android.encode.*   用於產生各種碼

com.google.zxing.client.android.history.*  儲存掃碼記錄

com.google.zxing.client.android.result.**  掃碼應用功能相關的功能性代碼

com.google.zxing.client.android.share.*  分享功能

com.google.zxing.client.android.wifi.*  WiFi相關,不清楚具體用途

com.google.zxing.datamatrix.**  datamatrix格式二維碼

com.google.zxing.maxicode.**  maxicode格式二維碼

com.google.zxing.multi.**  貌似是用於多格式支援的?我沒有用到這個包,如果有瞭解的麻煩告知

com.google.zxing.oned.**  one dimension一維碼,也就是條碼(你去百度搜oned會發現奇怪的東西。。)

com.google.zxing.pdf417.**  PDF417格式條碼

需要修改的是:

com.google.zxing.client.android.CaptureActivity:去掉其他功能的相關代碼,只保留核心功能,即掃碼功能。介面為一個FrameLayout裡麵包含一個SurfaceView。代碼移除就不詳細說了,直接看上傳的代碼吧,這個檔案我參考了http://www.cnblogs.com/keyindex/archive/2011/06/08/2074900.html這個連結裡的CaptureActivity的修改。

com.google.zxing.MultiFormatReader:這個是指定支援解碼的格式,需要把除QR_CODE以外的格式全部去掉,否則會因為刪掉瞭解碼包而報錯。具體也請看上傳的代碼。

com.google.zxing.client.result.ProductResultParser:parse函數中,同上。

com.google.zxing.client.android.DecodeThread:構造器中,同上。

另外:

com.google.zxing.client.result 我沒有刪減這個包的代碼,應該也是能最佳化的

 2、移除資源依賴,提供Dialog形式的掃碼功能

經過了第1步的精簡,其實只剩下了2個地方需要修改:

1.掃描介面

2.掃描成功時播放的beep音效檔

 

1:去除了其餘功能後,對於核心功能我們只需要一個SurfaceView和一個畫介面的View就可以了。代碼如下:

    /**     * use Java code to build layout instead of xml file     * @ch     */    private void buildLayout() {        requestWindowFeature(Window.FEATURE_NO_TITLE);         FrameLayout layout = new FrameLayout(this);        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);        layout.setLayoutParams(params);        surfaceView = new SurfaceView(this);        surfaceView.setLayoutParams(params);        layout.addView(surfaceView);        viewfinderView = new ViewfinderView(this, null);        layout.addView(viewfinderView);        setContentView(layout);    }

ViewfinderView是ZXing內建的View,如果要修改介面,直接修改它就可以了,我們第7點會提到。

2:由於我最終的目的是能打包成jar包,所以beep檔案不能放在res裡,而是放在assets裡。

//待補充

 

3、API相容(源碼只相容4.0以上,現相容至2.1)

這部分修改在源碼中標記為//@ch api compatible。

CaptureActivity.java:        //@ch api compatible        if (VERSION.SDK_INT < 11) {            //surfaceview will push buffer automatically            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        }//API 11之前需要手動設定,否則會無法顯示。API11之後為預設設定。CameraConfigurationManager.java:    //@ch api compatible    if (VERSION.SDK_INT < 13) {        theScreenResolution.x = display.getWidth();        theScreenResolution.y = display.getHeight();    } else {        display.getSize(theScreenResolution);    }//getSize是API 13之後的新API,之前需要用getWidth和getHeight。AutoFocusManager.java        //@ch api compatible        if (VERSION.SDK_INT > 11) {        newTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);        } else {            newTask.execute();        }//源碼中這裡設定了多線程的模式,THREAD_POOL_EXECUTOR表示這個task最多隻有5個線程同時運行,超過5個的就要等待。在低於API 11的版本中,此為預設選項。其實這裡只有單線程,所以隨便執行吧。OpenCameraInterface.java:    //@ch api compatible    if (VERSION.SDK_INT < 9) {        return openWithLowApi();    }......  /**   * for lower than API 9   * @ch api compatible   */  public static Camera openWithLowApi() {      //If the device does not have a back-facing camera, this returns null      Camera camera = Camera.open();      return camera;  }//源碼的開啟網路攝影機是能區分前後網路攝影機的,然而API 9之前並沒有自拍這個概念,所以做了一下處理

就幾個地方,不過也找了我個把小時了。

 

4、轉換為豎屏(源碼為橫屏)

ZXing預設是橫屏,但是我們一般的APP都會做成豎屏,如果掃碼的時候強制切換成橫屏那樣體驗就不好了。在修改ZXing的豎屏的時候,我按照的是一般APP的豎屏設定方法,結果發現沒有源碼的效果好,需要把碼放到很小才能完成。後面在調試過程中發現掃碼解析的地區和螢幕畫出來的地區不一樣,才知道這部分的修改出了問題。然後我搜尋找到一篇前輩的文章,參考了一下發現沒有改完全。

 

5、掃碼速度最佳化(主要分三點,現只完成了一點)6、裝置相容(針對低解析度裝置)本文還會提到:7、自訂介面8、最佳化調試方法

著作權,轉載請註明出處:

http://www.cnblogs.com/sickworm/p/4562081.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.