基於 Zxing 封裝的 Hndxing 掃碼庫

BaiHongHua發表於2018-02-14

前言

Hndxing 是一個基於 ZXing 原始碼的基礎上面,抽離其出 Android 端的掃碼功能,而進一步封裝而成的一個開源庫 。相信有過封裝 Zxing 官方原始碼的經歷的話,都會遇到在豎屏的時候,無法在豎屏時正常掃一維碼,掃一維碼的時候,需要把手機橫著掃碼,這就會給使用者造成非常不好的體驗;而且在掃二維碼的時候,需要把手機和需要掃的碼保持一定的距離,才可以正常掃碼,這也是會帶給使用者非常不好的體驗的;造成這些的原因,除了跟移動的手機端的攝像機硬體模組的成像特點有一定的關係,也是和 Zxing 的相關原始碼有一定的關係。哈哈,當然,這一篇筆者就先不討論造成上面的兩者的原因,而是主要介紹筆者封裝的掃碼庫的如何使用。

特性

  • 提供在豎屏狀態下設別一維碼、二維碼的功能;
  • 優化在豎屏狀態識別一維碼、二維碼的速度、距離;

效果

原生的 Hndroid 效果(因為虛擬機器不具有攝像頭,所以顯示的是黑灰格)

Hndxing 的原生效果

由開發者自定義後的 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 庫封裝了挺多優秀的開源庫,但是呢,考慮到自己目前還是個大三學生,這個專案還是個學習階段的,就沒有用到其他的第三方優秀的掃碼庫了。

Hndxing 原始碼庫地址

相關文章