前言
Hndxing 是一個基於 ZXing 原始碼的基礎上面,抽離其出 Android 端的掃碼功能,而進一步封裝而成的一個開源庫 。相信有過封裝 Zxing 官方原始碼的經歷的話,都會遇到在豎屏的時候,無法在豎屏時正常掃一維碼,掃一維碼的時候,需要把手機橫著掃碼,這就會給使用者造成非常不好的體驗;而且在掃二維碼的時候,需要把手機和需要掃的碼保持一定的距離,才可以正常掃碼,這也是會帶給使用者非常不好的體驗的;造成這些的原因,除了跟移動的手機端的攝像機硬體模組的成像特點有一定的關係,也是和 Zxing 的相關原始碼有一定的關係。哈哈,當然,這一篇筆者就先不討論造成上面的兩者的原因,而是主要介紹筆者封裝的掃碼庫的如何使用。
特性
- 提供在豎屏狀態下設別一維碼、二維碼的功能;
- 優化在豎屏狀態識別一維碼、二維碼的速度、距離;
效果
原生的 Hndroid 效果(因為虛擬機器不具有攝像頭,所以顯示的是黑灰格)
由開發者自定義後的 Hndroid 效果
使用
新增對應許可權
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
複製程式碼
新增 Gradle:
把 JitPack 庫加入到你的專案根目錄下的 build.gradle 檔案下
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
複製程式碼
新增依賴到你的專案中
dependencies {
compile 'com.github.Hndroid:Hndxing:1.0.1'
}
複製程式碼
or 新增 Maven:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
複製程式碼
新增依賴到你的專案中
<dependency>
<groupId>com.github.Hndroid</groupId>
<artifactId>Hndxing</artifactId>
<version>1.0.1</version>
</dependency>
複製程式碼
接下來新增兩個佈局控制元件到你的專案佈局中:
<SurfaceView
android:id="@+id/preview_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<com.makerspace.hndroid.hxing.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
複製程式碼
繼承抽象類 BarCodeActivity
並重寫其三個方法:
@Override
protected int provideContentView() {
//返回上面新增的兩個控制元件所在的佈局,代替
//onCreate()生命週期方法裡面的 setContentView() 方法;
return R.layout.activity_caputrue_layout;
}
@Override
protected SurfaceView setSurfaceViewInstance() {
//返回 SurfaceView 的物件引用
return findViewById(R.id.preview_view);
}
@Override
protected ViewfinderView setViewfinderViewInstance() {
//返回 ViewfinderView 的物件引用
return findViewById(R.id.viewfinder_view);
}
複製程式碼
最後,在已經繼承了抽象類 BarCodeActivity
的生命週期函式 onCreate()
回撥掃碼結果方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注:setContentView() 這裡不需要該方法了;
this.setOnBarCodeResultListener(new OnResultListener() {
@Override
public void onResult(String resultContext, String barcodeFormatName) {
//resultContext 表示已掃碼的內容
//barcodeFormatName 表示已掃碼的種類
}
});
}
複製程式碼
以上是呼叫 Hndroid 庫的一般步驟;
說明
為了使得 Android 開發者可以更加方便地呼叫 Hndxing 庫,開發者可以根據實際專案開發的需要,繼承
ViewfinderView
類,重寫其onDraw(Canvas canvas)
方法。下面是開放的其他介面:
API | 說明 |
---|---|
CameraManager.get().turnLightOn(); | 開啟手機的閃光燈; |
CameraManager.get().turnLightOff(); | 關閉手機的閃光燈; |
getBarcodeImage(String title); | 呼叫系統的相簿(title 是開啟對話方塊時的標題) |
一般來說,呼叫 getBarcodeImage(String title)
是為了獲取相簿裡面的二維碼或其他的碼類,呼叫該介面,需要在已經繼承了抽象類 BarCodeActivity
的生命週期函式 onCreate()
回撥掃碼結果方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setOnBarcodeImageChoseListener(new OnBarcodeImageChoseListener() {
@Override
public void onFail() {
//獲取二維碼圖片失敗後回撥的的方法;
}
@Override
public void onSuccess(String resultContext, String barcodeFormatName) {
//獲取二維碼圖片成功後回撥的的方法;
}
});
}
複製程式碼
小結
上面是 Hndxing 庫開放的 API,這是筆者第一次嘗試封裝的模組庫。因為在筆者最近的一個專案中,需要用到這個掃碼功能,在開發的同時,也順便把這個模組功能封裝成一個開源庫了。其中也是踩了挺多的坑的,哈哈,但是呢,還是踩坑踩過來了。當然,目前有許多大神也基於 Zxing 庫封裝了挺多優秀的開源庫,但是呢,考慮到自己目前還是個大三學生,這個專案還是個學習階段的,就沒有用到其他的第三方優秀的掃碼庫了。