天天看點

掃一掃——Zxing彩蛋!!

有些代碼不應該被忘記,也沒有源代碼不應該被記住(來自csdn首頁)

在我們平常生活中,我們經常會使用到掃一掃這一手機功能

比如:

使用支付寶或微信的掃一掃功能想别人付錢;

使用微信的掃一掃功能加别人為好友或關注某一公衆号;

使用摩拜單車的掃一掃功能解鎖自行車;

使用UC浏覽器的掃一掃功能打開某個網頁;

我們發現,我們離不開手機的掃一掃這一功能了!

那麼,這篇文章我們就一起通過一個例子學習一下Android的解析二維碼 和生成二維碼 是如何實作的!

1.Zxing

其實,我們自己實作掃一掃的功能是相當麻煩的

但是大神們早就做出了一個性能不錯的內建庫——Zxing

Zxing是一個開放源碼的,用Java實作的多種格式的1D、2D條碼圖像處理庫

它包含了聯系到其他語言的端口,也就是說它可以在不同的語言中,其中就包括Android

Zxing可以實作使用手機内置的攝像頭完成條形碼的掃描及解碼

也就是說,我們隻需要調用Zxing封裝好的方法就可以完成一系列諸如打開攝像頭、解析二維碼、生成二維碼的操作了

這裡我們提供一下Zxing官方的GitHub項目位址:

https://github.com/zxing/zxing

我們将Zxing 在GitHub 上的項目下載下傳下來

其實在我們下載下傳的壓縮包裡,是有多種語言的一個整合的代碼

但是,我們這裡隻需要Android端的源碼

怎麼辦呢,其實,我們網上的資源是相當豐富的

有一些技術大神為我們提取出來android端使用的代碼

我把它上傳到了我的百度雲盤當中,點選下載下傳,密碼:f3wx

2.将Zxing導入到項目中

首先我們将剛才下載下傳的libzxing解壓後備用

然後我們在AS中建立項目QRCodeDemo

這裡我們要注意,在我們建立項目時一定要選擇MinimunSDK 版本為16,如圖:

掃一掃——Zxing彩蛋!!

因為我們的zxing支援的4.1及4.1以上的安卓版本

好,項目建立完成,接下來我們就要導入libzxing了

1.點選File ——>New ——>Import Module

2.在彈出的下圖中的對話框中點選”…”按鈕,選擇libzxing檔案夾,點選Finish

掃一掃——Zxing彩蛋!!

3.依次點選下圖中的按鈕

掃一掃——Zxing彩蛋!!

4.點選“+”後選擇Module dependency,然後選擇libzxing,點選OK就導入完成了!

3.檢視學習libzxing中的代碼

下面我們看一下Xzing中的代碼,以便我們更靈活的使用它

首先我們找到并打開CaptureActivity的代碼

其實我們CaptureActivity就是我們掃描界面的Activity

我們在具體實作掃一掃功能的時候,隻需要打開CaptureActivity,然後将掃描結果拿到就可以了

我們可以在CaptureActivity中找到以下代碼:

public void handleDecode(Result rawResult, Bundle bundle) {
    inactivityTimer.onActivity();
    beepManager.playBeepSoundAndVibrate();

    Intent resultIntent = new Intent();
    bundle.putInt("width", mCropRect.width());
    bundle.putInt("height", mCropRect.height());
    bundle.putString("result", rawResult.getText());
    resultIntent.putExtras(bundle);
    this.setResult(RESULT_OK, resultIntent);
    CaptureActivity.this.finish();
}
           

我們可以看到handleDecode方法會通過Intent傳回一個鍵為result的結果

其實這就是我們掃描二維碼之後需要拿到的結果

在實際操作中我們就可以通過result鍵拿到資料

然後我們看一下libzxing的AndroidManifest檔案,我們可以看到以下權限:

其實,這樣個權限就是相機和震動的權限,也就是說我們在自己的代碼中中也不需要聲明任何權限,是不是很友善

我們在找到并打開EncodingUtils檔案

從注釋中我們可以看到,這是一個二維碼生成工具類

我們在實作生成二維碼的時候,隻需要調用這個工具類中的方法就可以了!

好,下面我們具體實作學一下功能!

4.解析二維碼

首先,我們配置一下MainActivity的xml檔案,代碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="win.yuanhongbao.www.qrcodedemo.MainActivity">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="scan"
    android:text="Start Scan" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Result :"
    android:textSize="28sp" />

<TextView
    android:id="@+id/tv_result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="28sp" />
</LinearLayout>
           

這裡我們簡單定義了一個開始掃描的Button,并為其添加了一個onClick屬性,一個顯示結果的TextView

然後我們執行個體化一下顯示結果的TextView,代碼如下:

private TextView mTvResult;

mTvResult = (TextView) findViewById(R.id.tv_result);
           

好,下面我們就要實作一下開始掃描的點選事件,代碼如下:

public void scan(View view) {
    startActivityForResult(new Intent(MainActivity.this, CaptureActivity.class), 0);
}
           

這裡我們使用了一個startActivityForResult方法,打開CaptureActivity

為什麼要使用startActivityForResult方法而不是直接startActivity呢

很簡單,是因為我們是需要拿到CaptureActivity傳回的結果的

然後我們需要調用一個

onActivityResult

方法來接傳回的結果,代碼如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        Bundle bundle = data.getExtras();
        String str_result = bundle.getString("result");
        mTvResult.setText(str_result);
    }
}
           

從代碼中我們可以看到我們進行了一個判斷,當結果解析成功後,我們通過result鍵,擷取到了結果,并将值賦給了顯示結果的TextView,很簡單吧

接下來我們運作程式,點選Start Scan:

掃一掃——Zxing彩蛋!!

掃描界面成功打開!

這裡我們可以使用“草料文本二維碼生成器”制作二維碼後掃描試一下!

成功了沒有?反正我是成功了!

如果點選Start Scan提示Camera error時,說明你的系統是android6.0以上,這裡需要打開手機的權限管理,手動打開權限!

好,這樣我們的解析二維碼就講解完了,接下來我們一起學習一下生成二維碼!

5.生成二維碼

首先,我們先配置一下MainActivity的xml檔案,添加一下代碼:

<EditText
    android:id="@+id/et_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Input" />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="make"
    android:text="Make QRCode" />

<CheckBox
    android:id="@+id/cb_logo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="logo"/>

<ImageView
    android:id="@+id/img_result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@mipmap/ic_launcher" />
           

這裡我們定義了一個EditText,用來擷取使用者輸入的文字,根據文字生成相應的二維碼

我們還定義了一個開始生成的Button,并為其添加了點選事件

定義了一個CheckBox用來選擇是否為二維碼添加logo

定義了一個ImageView用來顯示二維碼

然後,我們執行個體化一下控件:

rivate EditText mInput;
private ImageView mImgResult;
private CheckBox mCbLogo;

mInput = (EditText) findViewById(R.id.et_text);
mImgResult = (ImageView) findViewById(R.id.img_result);
mCbLogo = (CheckBox) findViewById(R.id.cb_logo);
           

然後,我們就可以實作一下Button的點選事件,代碼如下:

public void make(View view) {
    String str_input = mInput.getText().toString();
    if (str_input.equals("")) {
        Toast.makeText(MainActivity.this, "輸入不能為空", Toast.LENGTH_SHORT).show();
    } else {
        Bitmap bitmap = EncodingUtils.createQRCode(str_input, 500, 500,
                mCbLogo.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher) : null);//三目表達式
        mImgResult.setImageBitmap(bitmap);
    }
}
           

首先,我們先擷取了一下使用者輸入的文字

然後,我們進行了一個判斷,如果輸入為空,我們就提示使用者輸入文字

如果不為空,我們就執行生成二維碼的操作

在生成二維碼的操作中,我們使用一個Bitmap對象來接收二維碼生成工具類生成的二維碼

我們可以看到EncodingUtils類的createQRCode方法有四個參數:

1.第一個參數:二維碼對應的掃描結果;

2.第二、三個參數:二維碼的寬高;

3.第三個參數:二維碼的logo

在第三個參數中,我們使用了一個三目表達式

當checkbox選中的時候,我們就把ic_launcher這個圖檔作為二維碼的logo,如果沒有選中,我們就将logo設為null

好,這樣我們的生成二維碼的功能就完成了,我們運作

在輸入框中輸入Hello_Word,分别選中和不選中checkbox,點選Make QRCode,顯示如下:

掃一掃——Zxing彩蛋!!

是不是很簡單!

到此,我們對二維碼的解析和生成功能就學習完成了!

彩蛋!!

看到這裡的朋友你有福利了!我的個人微信公衆号上線了!衆多熱門技術文章,衆多有趣好玩的腦洞,請掃描下方二維碼關注!

掃一掃——Zxing彩蛋!!

程式猿幹貨分享,歡迎您的到來!

繼續閱讀