一個Android平臺上更快更簡單更精準的條形碼及二維碼解析框架。採用ZBar解析影像資料,相容Android4.0 (API14)
及以上版本。GitHub地址
最近更新
- V1.1.7
- 修復armeabi架構無法識別二維碼的問題。
OldCameraScanner
和NewCameraScanner
取消單例模式,增加單例訊號量CameraLock
解決可能產生的相機併發操作。CameraScanner
新增enableBrightnessFeedback(boolean enable)
介面,設定是否開啟亮度回饋。CameraListener
新增cameraBrightnessChanged(int brightness)
介面,對亮度變化進行回饋。GraphicDecoder
新增setCodeTypes(int[] codeType)
介面指定識別的型別。MaskConstraintLayout
及MaskRelativeLayout
新增frame_viewid
屬性,用於指定繪製陰影的View(便於開發者使用自定義的掃描框)。ZBarDecoder
構造方法調整。CameraScanner
中的setSurfaceTexture(SurfaceTexture surfaceTexture)
介面更名為setPreviewTexture(SurfaceTexture surfaceTexture)
,便於理解。- 移除
BaseHandler
。
目錄
示例demo
Demo下載 | 示例效果 |
---|---|
點此下載(1.7MB) 或掃描下面二維碼 |
功能介紹
本專案基於ZBar進行開發,分別對檢視、相機、解碼三個方面進行了封裝,同時降低三者之間的耦合,增加可靈活配置性。
-
檢視
- 自定義
AdjustTextureView
,繼承自TextureView
,開放setImageFrameMatrix
介面,可根據自身尺寸、影像幀寬高及旋轉角度對影像進行校正,解決預覽畫面變形等異常問題。 - 自定義
ScannerFrameView
,繼承自View
,可通過xml屬性或介面自定義掃描框、四個角及掃描線的尺寸、顏色、動畫等,具體屬性使用參考原始碼註解。 - 自定義
MaskRelativeLayout
&MaskConstraintLayout
,分別繼承自RelativeLayout
&ConstraintLayout
,用於繪製掃描框外部陰影。
- 自定義
-
相機
- 相容
android.hardware.camera2
及android.hardware.Camera
兩版API。 - 子執行緒開啟camera,防止阻塞主執行緒造成介面跳轉卡頓。
- 採用單例訊號量控制,防止多個例項同時操作相機裝置引發異常。 *加入亮度回饋,可智慧提示開啟閃光燈。
- 開放掃碼框Rect設定介面,根據預覽尺寸、影像幀尺寸、預覽方向計算出掃碼框在影像幀上的實際位置,以指定影像識別區域。
- 用
TextureReader
代替ImageReader
,採用openGL繪製影像紋理,主要解決ImageReader
實時輸出YUV格式影像時預覽掉幀嚴重的問題。
- 相容
-
解碼
- 支援指定影像區域識別。
- 開放條碼型別配置介面,可任意指定需要識別的條碼型別。
- 解碼回撥結果包含條碼型別、條碼精度,可配置髒資料過濾規則。
UML類圖
整合方式
在module的build.gradle
中新增如下程式碼
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
- 修復armeabi架構無法識別二維碼的問題。
- 增加亮度反饋,可實現提示開啟閃光燈功能。
CameraScanner
取消單例模式,增加單例訊號量CameraLock
解決可能產生的相機併發操作。GraphicDecoder
新增setCodeTypes
介面指定識別的型別。MaskConstraintLayout
及MaskRelativeLayout
新增frame_viewid
屬性,用於指定繪製陰影的View(便於開發者使用自定義的掃描框)。- demo介面調整。
- 釋出開源庫:
cn.simonlee.xcodescanner:zbar:1.1.7
。
補充:
ZBarDecoder
構造方法調整。CameraScanner
中的setSurfaceTexture(SurfaceTexture surfaceTexture)
介面更名為setPreviewTexture(SurfaceTexture surfaceTexture)
,便於理解。CameraScanner
新增enableBrightnessFeedback(boolean enable)
介面,設定是否開啟亮度回饋。CameraListener
新增cameraBrightnessChanged(int brightness)
介面,對亮度變化進行回饋。- 移除
BaseHandler
。
-
V1.1.6
2018/05/08
GraphicDecoder
增加本地圖片識別介面。- 廢棄
GraphicDecoder.DecodeListener
中的decodeSuccess
回撥,改為decodeComplete
。 CameraScanner
新增閃光燈控制介面。- 解決
AdjustTextureView
尺寸變化導致影像顯示異常的問題。 - 釋出開源庫:
cn.simonlee.xcodescanner:zbar:1.1.6
。
-
V1.1.5
2018/05/01
- 解決申請許可權閃退的問題。
- 解決魅族MX5閃退的問題。
- 修改
ZBarDecoder
和TextureReader
的實現方式,降低CPU佔用。 - 暫停/延時解碼介面從
CameraScanner
遷移到GraphicDecoder
,CameraScanner
可能因為非同步導致暫停後繼續回撥decodeSuccess
介面。 - 釋出開源庫:
cn.simonlee.xcodescanner:zbar:1.1.5
。
-
V1.1.4
2018/04/26
- 解決Android4.2退出時閃退的問題。
- 解決某些低端機型可能預覽嚴重丟幀的問題。
- 解決
OldCameraScanner
預設沒有開啟解碼的問題。 - 釋出開源庫:
cn.simonlee.xcodescanner:zbar:1.1.4
。
-
V1.1.3
2018/04/25
- 修復部分x86裝置閃退的問題。
CameraScanner
新增stopDecode()
和startDecode(int delay)
介面,可暫停/延時解碼。- ZBar包名由
com.simonlee.xcodescanner
變更為cn.simonlee.xcodescanner
。 - 釋出開源庫:
cn.simonlee.xcodescanner:zbar:1.1.3
。
-
V1.1.2
2018/04/24
- 修復
ZBarDecoder
中設定解碼格式無效的問題。
- 修復
-
V1.1.1
2018/04/16
ScannerFrameView
增加高佔比屬性,可設定相對父容器高的佔比。
-
V1.1.0
2018/04/16
- 重寫
ZBarDecoder
,解決單執行緒池可能引起的條碼解析延遲問題。 - 解決
OldCameraScanner
掃描框區域識別異常的問題。
- 重寫
-
V1.0.9
2018/04/14
- 解決
NewCameraScanner
掃描框區域識別異常的問題。 - 解決連續快速旋轉螢幕時
NewCameraScanner
出現異常的問題。
- 解決
-
V1.0.8
2018/04/13
AutoFixTextureView
更名為AdjustTextureView
,重寫影像校正方式。Camera2Scanner
更名為NewCameraScanner
。- 新增
OldCameraScanner
實現對Android5.0
以下的支援。 - 下調minSdkVersion至14。
- 解決前後臺切換,橫豎屏切換可能產生的異常。
NewCameraScanner
中取消ImageReader
的支援。
-
V1.0.7
2018/04/10
- 調整掃描框寬高計算方式,新增
MaskConstraintLayout
佈局。 - 優化
Camera2Scanner
,解決後臺切換導致的閃退問題。
- 調整掃描框寬高計算方式,新增
-
V1.0.6
2018/04/09
- 調整程式碼結構,將掃碼核心從app移植到zbar中。
-
V1.0.5
2018/03/29
- 增加幀資料的最大尺寸限制,避免因過高畫素導致ZBar解析二維碼失敗。
- 遮蔽ZBar對DataBar(RSS-14)型別條碼的支援,此型別實用性不高,且易產生誤判。
-
V1.0.4
2018/03/27
- 修改
ZBarDecoder
,修復多執行緒可能的空指標異常。 - 修改
GraphicDecoder
,EGL14替換EGL10,解決部分機型不相容的問題;解決多執行緒可能的空指標異常。
- 修改
-
V1.0.3
2018/03/23
- 新增
TextureReader
,通過雙緩衝紋理獲取幀資料進行回撥,代替ImageReader的使用。 - 修改
GraphicDecoder
,handler放到子類中去操作。
- 新增
-
V1.0.2
2018/03/14
- 新增抽象類
GraphicDecoder
,將條碼解析模組進行抽離。 - 新增
ZBarDecoder
,採用ZBar解析條碼,並增加解析型別及解析精度設定。 - 修改
ScannerFrameView
,掃描線動畫由屬性動畫實現。 - 修改
Camera2Scanner
,修復釋放相機可能導致的異常,增加掃描框區域設定。 - 其他微調。
- 新增抽象類
-
V1.0.1
2018/02/09
- 新增
ScannerFrameLayout
,為RelativeLayout
的子類,可對掃描框的位置和大小進行設定。 - 修改
ScannerFrameView
,可對掃描框內部進行定製。
- 新增
-
V1.0.0
2018/02/03
初次提交程式碼。
關於作者
這是我個人的第一個開源專案,在開源的過程中碰到了許多疑點難點,多處借鑑很多大神的成果。因為自己的疏忽沒有預先做好參考記錄,在這裡向那些為開源默默奉獻的大神們致敬!Thanks!
如果在使用過程中遇到了閃退、黑屏、無法識別、無法對焦、預覽掉幀、記憶體洩漏等任何異常問題,歡迎提Issues!同時請儘量附上裝置型號、android版本號、BUG復現步驟、異常日誌、無法識別的影像等,我會盡快安排解決。(若回覆不及時可直接微信)
如果您覺得有用,請動動小手給我一個Star來點鼓勵吧
Author | GitHub | ||
---|---|---|---|
Simon Lee | jmlixiaomeng@163.com | XCodeScanner |