Android Zxing框架 生成二維碼+掃碼功能
- 配置
- 生成二維碼
- 掃碼
- 總結
zxing是一個二維碼的框架,
配置
1、

implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
如果報錯在這個檔案的android下加上如下配置,讓其支持Java1.8,不然只有1.7、1.6
(可在'app'右鍵---->open module settings------>Module看到)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
2、

<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" /> <uses-permission android:name="android.permission.CAMERA"/>
記得點擊Sync Now
生成二維碼
步驟:
1、自定義一個負責生成二維碼的類,方便呼叫,回傳一個Bitmap
要點:利用Zxing中的 BarcodeEncoder 的 encodeBitmap方法
public Bitmap encodeBitmap(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints) throws WriterException
encodeBitmap方法
| 引數 | 內容 |
|---|---|
| contents | 碼的內容 |
| format | 碼的型別(二維碼、條形碼…) |
| width | 碼的寬度 |
| height | 碼的高度 |
| hints | 碼的額外引數 |
Map<EncodeHintType, ?> hints碼的額外引數
這里列舉了一些常用的
這些都是Zxing中定義好的
| 引數 | 內容 |
|---|---|
| EncodeHintType.ERROR_CORRECTION | 設定容錯率 L>M>Q>H 等級越高掃描時間越長,準確率越高 |
| EncodeHintType.CHARACTER_SET | 設定字符集 |
| EncodeHintType.MARGIN | 設定邊距 |
QRcode類
package com.example.xianyu;
import android.graphics.Bitmap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import java.util.HashMap;
import java.util.Map;
public class QRcode{
public Bitmap qrcode(String content){
int width = 400;
int height = 400;
//HashMap設定二維碼引數
Map map = new HashMap();
// 設定容錯率 L>M>Q>H 等級越高掃描時間越長,準確率越高
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
//設定字符集
map.put(EncodeHintType.CHARACTER_SET,"utf-8");
//設定外邊距
map.put(EncodeHintType.MARGIN,1);
//利用編碼器,生成二維碼
BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
Bitmap bitmap = null;
try {
bitmap = barcodeEncoder.encodeBitmap(content, BarcodeFormat.QR_CODE, width, height,map);
} catch (WriterException e) {
e.printStackTrace();
}
return bitmap;
}
}
2、在要生成二維碼的Activity,呼叫上述類,輸入二維碼內容生成二維碼,之后顯示在ImageView組件上
MainActivity
public class MainActivity extends AppCompatActivity {
ImageView Code;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Code = findViewById(R.id.iv_code);
QRcode qrcode = new QRcode();
Bitmap bitmap= qrcode.qrcode("CSDN");
Code.setImageBitmap(bitmap);
}
成功獲得二維碼內容

掃碼
步驟:
1、給點擊掃碼的組件添加點擊監聽事件
2、在監聽事件中,利用Intent和startActivityForResult跳到Zxing定義好的默認的掃碼界面CaptureActivity中(也可以自定義掃碼界面)
3、重寫onActivityResult方法處理二維碼回傳的內容
要點:
其中的REQUEST_CODEZxing是定義好的,一定要使用這個CODE
不然在onActivityResult方法中決議二維碼將會不起作用
IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
這段原始碼可知REQUEST_CODE要相等才會進行二維碼決議,否則將會回傳 null
public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUEST_CODE) {
return parseActivityResult(resultCode, intent);
}
return null;
}
設定監聽:
Code.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent,REQUEST_CODE);
}
});
重寫Activity中的onActivityResult得到二維碼內容,我這里只是將獲得的內容進行簡單的輸出
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
if(result.getContents() == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
總結
更多內容請到github查看:https://github.com/zxing/zxing
喜歡Android的可以給我點個關注,不斷更新干貨
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/7937.html
標籤:其他
