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
}
记得点击Sync Now
步骤:
1、自定义一个负责生成二维码的类,方便调用,返回一个Bitmap
要点:利用Zxing中的 BarcodeEncoder
的 encodeBitmap
方法
public Bitmap encodeBitmap(String contents, BarcodeFormat format, int width, int height, Map hints) throws WriterException
encodeBitmap方法
参数 | 内容 |
---|---|
contents | 码的内容 |
format | 码的类型(二维码、条形码…) |
width | 码的宽度 |
height | 码的高度 |
hints | 码的额外参数 |
Map
这里列举了一些常用的
这些都是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_CODE
Zxing是定义好的,一定要使用这个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的可以给我点个关注,不断更新干货