1. 程式人生 > >Android新興掃碼框架:XCodeScanner(持續更新)

Android新興掃碼框架:XCodeScanner(持續更新)

一個Android平臺上更快更簡單更精準的條形碼及二維碼解析框架。採用ZBar解析影象資料,相容Android4.0 (API14)及以上版本。

CSDN可能更新不夠及時,瞭解最新版本詳見 GitHub專案地址

目錄

示例demo

Demo下載 示例效果
點此下載 或掃描下面二維碼
demo
gif

功能介紹

本專案基於ZBar進行開發,分別對檢視、相機、解碼三個方面進行了高度封裝,同時降低三者之間的耦合,增加可靈活配置性。

  • 檢視

    • 自定義AdjustTextureView
      ,繼承自TextureView,開放setImageFrameMatrix介面,可根據自身尺寸、影象幀寬高及旋轉角度對影象進行校正,解決預覽畫面變形等異常問題。
    • 自定義ScannerFrameView,繼承自View,可通過xml屬性或介面自定義掃描框、四個角及掃描線的尺寸、顏色、動畫等,具體屬性使用參考原始碼註解
    • 自定義MaskRelativeLayout&MaskConstraintLayout,分別繼承自RelativeLayout&ConstraintLayout,做為ScannerFrameView的父容器,用於繪製掃描框外部陰影。
  • 相機

    • 相容android.hardware.camera2
      android.hardware.Camera兩版API。
    • 子執行緒開啟camera,防止阻塞主執行緒造成介面跳轉卡頓。
    • 採用單例模式,防止出現多個例項同時操作相機裝置引發異常。
    • 開放掃碼框Rect設定介面,根據預覽尺寸、影象幀尺寸、預覽方向計算出掃碼框在影象幀上的實際位置,以指定影象識別區域。
    • TextureReader代替ImageReader,採用openGL繪製圖像紋理,主要解決預覽掉幀嚴重的問題,實時輸出YUV格式影象。
  • 解碼

    • 支援指定影象區域識別。
    • 開放條碼型別配置介面,可任意指定需要識別的條碼型別。
    • 解碼回撥結果包含條碼型別、條碼精度,可配置髒資料過濾規則。

UML類圖

uml

整合方式

在module的build.gradle中新增如下程式碼

    dependencies {
        implementation 'cn.simonlee.xcodescanner:zbar:1.1.6'
    }

使用方式

  • STEP.1
    在Activity的onCreate方法中獲取CameraScanner例項,並對CameraScanner和TextureView設定監聽
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_scan_constraint);
   mTextureView = findViewById(R.id.textureview);
   mTextureView.setSurfaceTextureListener(this);
   if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
      mCameraScanner = OldCameraScanner.getInstance();
   } else {
      mCameraScanner = NewCameraScanner.getInstance();
   }
   mCameraScanner.setCameraListener(this);
}
  • STEP.2
    在onSurfaceTextureAvailable回撥中設定SurfaceTexture及TextureView的寬高,然後開啟相機
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
   mCameraScanner.setSurfaceTexture(surface);
   mCameraScanner.setPreviewSize(width, height);
   mCameraScanner.openCamera(this.getApplicationContext());
}
  • STEP.3
    在openCameraSuccess回撥中設定影象幀的寬高及旋轉角度,獲取ZBarDecoder例項設定給CameraScanner
public void openCameraSuccess(int frameWidth, int frameHeight, int frameDegree) {
   mTextureView.setImageFrameMatrix(frameWidth, frameHeight, frameDegree);
   if (mGraphicDecoder == null) {
      mGraphicDecoder = new ZBarDecoder();//使用帶參構造方法可指定條碼識別的格式
      mGraphicDecoder.setDecodeListener(this);
   }
   //呼叫setFrameRect方法會對識別區域進行限制,注意getLeft等獲取的是相對於父容器左上角的座標,實際應傳入相對於TextureView左上角的座標。
   mCameraScanner.setFrameRect(mScannerFrameView.getLeft(), mScannerFrameView.getTop(), mScannerFrameView.getRight(), mScannerFrameView.getBottom());
   mCameraScanner.setGraphicDecoder(mZBarDecoder);
}
  • STEP.4
    在ZBarDecoder的decodeSuccess回撥中獲取解析結果,開發者可根據回傳的條碼型別及精度自定義髒資料過濾規則
public void decodeSuccess(int type, int quality, String result) {
   ToastHelper.showToast("[型別" + type + "/精度" + quality + "]" + result, ToastHelper.LENGTH_SHORT);
}
  • STEP.5
    在Activity的onDestroy方法中關閉相機和解碼
public void onDestroy() {
   mCameraScanner.setGraphicDecoder(null);
   mCameraScanner.detach();
   if (mGraphicDecoder != null) {
      mGraphicDecoder.setDecodeListener(null);
      mGraphicDecoder.detach();
   }
   super.onDestroy();
}
  • 注意.1
    在Activity的onPause方法中關閉相機
public void onPause() {
   mCameraScanner.closeCamera();
   super.onPause();
}
  • 注意.2
    在Activity的onRestart方法中開啟相機
public void onRestart() {
   //部分機型在後臺轉前臺時會回撥onSurfaceTextureAvailable開啟相機,因此要做判斷防止重複開啟
   if (mTextureView.isAvailable()) {
      mCameraScanner.setSurfaceTexture(mTextureView.getSurfaceTexture());
      mCameraScanner.setPreviewSize(mTextureView.getWidth(), mTextureView.getHeight());
      mCameraScanner.openCamera(this.getApplicationContext());
   }
   super.onRestart();
}

更新計劃

  • 增加環境亮度監測。
  • 結合OpenCV,提供二維碼檢測、二維碼定位、角度校正、影象濾波等支援,以解決複雜圖形的識別問題。
  • 增加Zxing支援。
  • 增加二維碼生成功能。

版本記錄

  • V1.1.6 2018/05/08

    1. GraphicDecoder增加本地圖片識別介面。
    2. 廢棄GraphicDecoder.DecodeListener中的decodeSuccess回撥,改為decodeComplete
    3. CameraScanner新增閃光燈控制介面。
    4. 解決AdjustTextureView尺寸變化導致影象顯示異常的問題。
    5. 釋出開源庫:cn.simonlee.xcodescanner:zbar:1.1.6
  • V1.1.5 2018/05/01

    1. 解決申請許可權閃退的問題。
    2. 解決魅族MX5閃退的問題。
    3. 修改ZBarDecoderTextureReader的實現方式,降低CPU佔用。
    4. 新增DebugZBarDecoder,繼承自ZBarDecoder,便於示例程式進行相容性測試。
    5. 暫停/延時解碼介面從CameraScanner遷移到GraphicDecoderCameraScanner可能因為非同步導致暫停後繼續回撥decodeSuccess介面。
    6. 釋出開源庫:cn.simonlee.xcodescanner:zbar:1.1.5
  • V1.1.4 2018/04/26

    1. 解決Android4.2退出時閃退的問題。
    2. 解決某些低端機型可能預覽嚴重丟幀的問題。
    3. 解決OldCameraScanner預設沒有開啟解碼的問題。
    4. 釋出開源庫:cn.simonlee.xcodescanner:zbar:1.1.4
  • V1.1.3 2018/04/25

    1. 修復部分x86裝置閃退的問題。
    2. CameraScanner新增stopDecode()startDecode(int delay)介面,可暫停/延時解碼。
    3. ZBar包名由com.simonlee.xcodescanner變更為com.simonlee.xcodescanner
    4. 釋出開源庫:cn.simonlee.xcodescanner:zbar:1.1.3codescanner變更為xcodescanner,由此帶來不便的敬請諒解。
    5. 有開發者反饋部分機型存在閃退、無法解析二維碼的問題,將在近期解決。
  • V1.1.2 2018/04/24

    1. 修復ZBarDecoder中設定解碼格式無效的問題。
  • V1.1.1 2018/04/16

    1. ScannerFrameView增加高佔比屬性,可設定相對父容器高的佔比。
    2. 釋出開源庫:cn.simonlee.codescanner:zbar:1.1.1
  • V1.1.0 2018/04/16

    1. 重寫ZBarDecoder,解決單執行緒池可能引起的條碼解析延遲問題。
    2. 解決OldCameraScanner掃描框區域識別異常的問題。
  • V1.0.9 2018/04/14

    1. 解決NewCameraScanner掃描框區域識別異常的問題。
    2. 解決連續快速旋轉螢幕時NewCameraScanner出現異常的問題。
  • V1.0.8 2018/04/13

    1. AutoFixTextureView更名為AdjustTextureView,重寫影象校正方式。
    2. Camera2Scanner更名為NewCameraScanner
    3. 新增OldCameraScanner實現對Android5.0以下的支援。
    4. 下調minSdkVersion至14。
    5. 解決前後臺切換,橫豎屏切換可能產生的異常。
    6. NewCameraScanner中取消ImageReader的支援。
  • V1.0.7 2018/04/10

    1. 調整掃描框寬高計算方式,新增MaskConstraintLayout佈局。
    2. 優化Camera2Scanner,解決後臺切換導致的閃退問題。
  • V1.0.6 2018/04/09

    1. 調整程式碼結構,將掃碼核心從app移植到zbar中。
  • V1.0.5 2018/03/29

    1. 增加幀資料的最大尺寸限制,避免因過高畫素導致ZBar解析二維碼失敗。
    2. 遮蔽ZBar對DataBar(RSS-14)格式條碼的支援,此格式實用性不高,且易產生誤判。
  • V1.0.4 2018/03/27

    1. 修改ZBarDecoder,修復多執行緒可能的空指標異常。
    2. 修改GraphicDecoder,EGL14替換EGL10,解決部分機型不相容的問題;解決多執行緒可能的空指標異常。
  • V1.0.3 2018/03/23

    1. 新增TextureReader,通過雙緩衝紋理獲取幀資料進行回撥,代替ImageReader的使用。
    2. 修改GraphicDecoder,handler放到子類中去操作。
  • V1.0.2 2018/03/14

    1. 新增抽象類GraphicDecoder,將條碼解析模組進行抽離。
    2. 新增ZBarDecoder,採用ZBar解析條碼,並增加解析型別及解析精度設定。
    3. 修改ScannerFrameView,掃描線動畫由屬性動畫實現。
    4. 修改Camera2Scanner,修復釋放相機可能導致的異常,增加掃描框區域設定。
    5. 其他微調。
  • V1.0.1 2018/02/09

    1. 新增ScannerFrameLayout,為RelativeLayout的子類,可對掃描框的位置和大小進行設定。
    2. 修改ScannerFrameView,可對掃描框內部進行定製。
  • V1.0.0 2018/02/03
    初次提交程式碼。

關於作者

這是我個人的第一個開源專案,慢慢悠悠也投入了不少精力。在開源的過程中碰到了許多疑點難點,其中借鑑了很多大神的成果。在這裡向那些為開源默默奉獻的大神們致敬!謝謝你們!

如果在使用過程中遇到了閃退、黑屏、無法識別、無法對焦、預覽掉幀、記憶體洩漏等任何異常問題,歡迎提Issues!同時請儘量附上裝置型號、android版本號、BUG復現步驟、異常日誌、無法識別的影象等,我會盡快安排解決。

如果您覺得有用,請動動小手給我一個Star來點鼓勵吧