一個Android平臺上更快更簡單更精準的條形碼及二維碼解析框架。採用ZBar解析圖像數據,兼容Android4.0 (API14)
及以上版本。GitHub地址java
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下載 | 示例效果 |
---|---|
點此下載(1.7MB) 或掃描下面二維碼 |
本項目基於ZBar進行開發,分別對視圖、相機、解碼三個方面進行了封裝,同時下降三者之間的耦合,增長可靈活配置性。android
視圖git
AdjustTextureView
,繼承自TextureView
,開放setImageFrameMatrix
接口,可根據自身尺寸、圖像幀寬高及旋轉角度對圖像進行校訂,解決預覽畫面變形等異常問題。ScannerFrameView
,繼承自View
,可經過xml屬性或接口自定義掃描框、四個角及掃描線的尺寸、顏色、動畫等,具體屬性使用參考源碼註解。MaskRelativeLayout
&MaskConstraintLayout
,分別繼承自RelativeLayout
&ConstraintLayout
,用於繪製掃描框外部陰影。相機github
android.hardware.camera2
及android.hardware.Camera
兩版API。TextureReader
代替ImageReader
,採用openGL繪製圖像紋理,主要解決ImageReader
實時輸出YUV格式圖像時預覽掉幀嚴重的問題。解碼xcode
在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屬性。
V1.1.7 2018/08/07
CameraScanner
取消單例模式,增長單例信號量CameraLock
解決可能產生的相機併發操做。GraphicDecoder
新增setCodeTypes
接口指定識別的類型。MaskConstraintLayout
及MaskRelativeLayout
新增frame_viewid
屬性,用於指定繪製陰影的View(便於開發者使用自定義的掃描框)。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
ZBarDecoder
和TextureReader
的實現方式,下降CPU佔用。CameraScanner
遷移到GraphicDecoder
,CameraScanner
可能由於異步致使暫停後繼續回調decodeSuccess
接口。cn.simonlee.xcodescanner:zbar:1.1.5
。V1.1.4 2018/04/26
OldCameraScanner
默認沒有開啓解碼的問題。cn.simonlee.xcodescanner:zbar:1.1.4
。V1.1.3 2018/04/25
CameraScanner
新增stopDecode()
和startDecode(int delay)
接口,可暫停/延時解碼。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
如下的支持。NewCameraScanner
中取消ImageReader
的支持。V1.0.7 2018/04/10
MaskConstraintLayout
佈局。Camera2Scanner
,解決後臺切換致使的閃退問題。V1.0.6 2018/04/09
V1.0.5 2018/03/29
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 |