有些代碼不應該被忘記,也沒有源代碼不應該被記住(來自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支援的4.1及4.1以上的安卓版本
好,項目建立完成,接下來我們就要導入libzxing了
1.點選File ——>New ——>Import Module
2.在彈出的下圖中的對話框中點選”…”按鈕,選擇libzxing檔案夾,點選Finish
3.依次點選下圖中的按鈕
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:
掃描界面成功打開!
這裡我們可以使用“草料文本二維碼生成器”制作二維碼後掃描試一下!
成功了沒有?反正我是成功了!
如果點選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,顯示如下:
是不是很簡單!
到此,我們對二維碼的解析和生成功能就學習完成了!
彩蛋!!
看到這裡的朋友你有福利了!我的個人微信公衆号上線了!衆多熱門技術文章,衆多有趣好玩的腦洞,請掃描下方二維碼關注!
程式猿幹貨分享,歡迎您的到來!