Android新興掃碼框架:XCodeScanner(最近更新2018-08-17)

一個Android平臺上更快更簡單更精準的條形碼及二維碼解析框架。採用ZBar解析圖像數據,兼容Android4.0 (API14)及以上版本。GitHub地址java

最近更新
  • V1.1.7
    1. 修復armeabi架構沒法識別二維碼的問題。
    2. OldCameraScannerNewCameraScanner取消單例模式,增長單例信號量CameraLock解決可能產生的相機併發操做。
    3. CameraScanner新增enableBrightnessFeedback(boolean enable)接口,設置是否開啓亮度回饋。
    4. CameraListener新增cameraBrightnessChanged(int brightness)接口,對亮度變化進行回饋。
    5. GraphicDecoder新增setCodeTypes(int[] codeType)接口指定識別的類型。
    6. MaskConstraintLayoutMaskRelativeLayout新增frame_viewid屬性,用於指定繪製陰影的View(便於開發者使用自定義的掃描框)。
    7. ZBarDecoder構造方法調整。
    8. CameraScanner中的setSurfaceTexture(SurfaceTexture surfaceTexture)接口改名爲setPreviewTexture(SurfaceTexture surfaceTexture),便於理解。
    9. 移除BaseHandler

目錄

示例demo

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

功能介紹

本項目基於ZBar進行開發,分別對視圖、相機、解碼三個方面進行了封裝,同時下降三者之間的耦合,增長可靈活配置性。android

  • 視圖git

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

    • 兼容android.hardware.camera2android.hardware.Camera兩版API。
    • 子線程開啓camera,防止阻塞主線程形成界面跳轉卡頓。
    • 採用單例信號量控制,防止多個實例同時操做相機設備引起異常。 *加入亮度回饋,可智能提示開啓閃光燈。
    • 開放掃碼框Rect設置接口,根據預覽尺寸、圖像幀尺寸、預覽方向計算出掃碼框在圖像幀上的實際位置,以指定圖像識別區域。
    • TextureReader代替ImageReader,採用openGL繪製圖像紋理,主要解決ImageReader實時輸出YUV格式圖像時預覽掉幀嚴重的問題。
  • 解碼xcode

    • 支持指定圖像區域識別。
    • 開放條碼類型配置接口,可任意指定須要識別的條碼類型。
    • 解碼回調結果包含條碼類型、條碼精度,可配置髒數據過濾規則。

UML類圖

uml.png

集成方式

在module的build.gradle中添加以下代碼bash

dependencies {
        implementation 'cn.simonlee.xcodescanner:zbar:1.1.7'
    }
複製代碼

使用方式

  • 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);
        /* * 注意,SDK21的設備是可使用NewCameraScanner的,可是可能存在對新API支持不夠的狀況,好比紅米Note3(雙網通Android5.0.2) * 開發者可自行配置使用規則,好比針對某設備型號過濾,或者針對某SDK版本過濾 * */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mCameraScanner = new NewCameraScanner(this);
        } else {
            mCameraScanner = new OldCameraScanner(this);
        }
    }
    複製代碼
  • STEP.2架構

    在onSurfaceTextureAvailable回調中設置SurfaceTexture及TextureView的寬高,而後開啓相機併發

    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        mCameraScanner.setPreviewTexture(surface);
        mCameraScanner.setPreviewSize(width, height);
        mCameraScanner.openCamera(this);
    }
    複製代碼
  • 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(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();
    }
    複製代碼

注意事項

  • Tips.1

    在Activity的onPause方法中關閉相機

    public void onPause() {
        mCameraScanner.closeCamera();
        super.onPause();
    }
    複製代碼
  • Tips.2

    在Activity的onRestart方法中開啓相機

    public void onRestart() {
        //部分機型在後臺轉前臺時會回調onSurfaceTextureAvailable開啓相機,所以要作判斷防止重複開啓
        if (mTextureView.isAvailable()) {
            mCameraScanner.setPreviewTexture(mTextureView.getSurfaceTexture());
            mCameraScanner.setPreviewSize(mTextureView.getWidth(), mTextureView.getHeight());
            mCameraScanner.openCamera(this.getApplicationContext());
        }
        super.onRestart();
    }
    複製代碼
  • Tips.3

    設置掃碼框識別區域時,要考慮到掃碼框的margin和padding屬性。

更新計劃

  • 結合OpenCV,提供二維碼檢測、二維碼定位、角度校訂、圖像濾波等支持,以解決複雜圖形的識別問題。
  • 增長Zxing支持。
  • 增長二維碼生成功能。

版本記錄

  • V1.1.7 2018/08/07

    1. 修復armeabi架構沒法識別二維碼的問題。
    2. 增長亮度反饋,可實現提示開啓閃光燈功能。
    3. CameraScanner取消單例模式,增長單例信號量CameraLock解決可能產生的相機併發操做。
    4. GraphicDecoder新增setCodeTypes接口指定識別的類型。
    5. MaskConstraintLayoutMaskRelativeLayout新增frame_viewid屬性,用於指定繪製陰影的View(便於開發者使用自定義的掃描框)。
    6. demo界面調整。
    7. 發佈開源庫:cn.simonlee.xcodescanner:zbar:1.1.7

    補充:

    1. ZBarDecoder構造方法調整。
    2. CameraScanner中的setSurfaceTexture(SurfaceTexture surfaceTexture)接口改名爲setPreviewTexture(SurfaceTexture surfaceTexture),便於理解。
    3. CameraScanner新增enableBrightnessFeedback(boolean enable)接口,設置是否開啓亮度回饋。
    4. CameraListener新增cameraBrightnessChanged(int brightness)接口,對亮度變化進行回饋。
    5. 移除BaseHandler
  • 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. 暫停/延時解碼接口從CameraScanner遷移到GraphicDecoderCameraScanner可能由於異步致使暫停後繼續回調decodeSuccess接口。
    5. 發佈開源庫: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變動爲cn.simonlee.xcodescanner
    4. 發佈開源庫:cn.simonlee.xcodescanner:zbar:1.1.3
  • V1.1.2 2018/04/24

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

    1. ScannerFrameView增長高佔比屬性,可設置相對父容器高的佔比。
  • 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 初次提交代碼。

關於做者

這是我我的的第一個開源項目,在開源的過程當中碰到了許多疑點難點,多處借鑑不少大神的成果。由於本身的疏忽沒有預先作好參考記錄,在這裏向那些爲開源默默奉獻的大神們致敬!Thanks!

若是在使用過程當中遇到了閃退、黑屏、沒法識別、沒法對焦、預覽掉幀、內存泄漏等任何異常問題,歡迎提Issues!同時請儘可能附上設備型號、android版本號、BUG復現步驟、異常日誌、沒法識別的圖像等,我會盡快安排解決。(若回覆不及時可直接微信)

若是您以爲有用,請動動小手給我一個Star來點鼓勵吧

Author E-mail GitHub WeChat
Simon Lee jmlixiaomeng@163.com XCodeScanner
wechat
相關文章
相關標籤/搜索