implementation 'com.google.zxing:core:3.4.0'
package com.kgzn.smartalbum.net.qrcode;
import android.graphics.Bitmap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import java.util.HashMap;
import java.util.Map;
public class QRCodeUtils {
private final static int SCAN_WIDTH = 400;
private final static int SCAN_HEIGHT = 400;
private static volatile QRCodeUtils instance;
private final Map<EncodeHintType, Object> mEncodeMap;
private final MultiFormatWriter writer;
private QRCodeUtils() {
writer = new MultiFormatWriter();
mEncodeMap = new HashMap<>();
mEncodeMap.put(EncodeHintType.CHARACTER_SET, "utf-8");
mEncodeMap.put(EncodeHintType.MARGIN, 1);
}
public static QRCodeUtils getInstance() {
if (instance == null) {
synchronized (QRCodeUtils.class) {
if (instance == null) {
instance = new QRCodeUtils();
}
}
}
return instance;
}
private Bitmap encode(QRCodeInfo bean, int width, int height) {
BitMatrix matrix;
try {
matrix = writer.encode(bean.getResultText(), bean.getFormat(), width, height, mEncodeMap);
} catch (WriterException e) {
e.printStackTrace();
return null;
}
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (matrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
} else {
pixels[y * width + x] = 0xffffffff;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, height, 0, 0, width, height);
return bitmap;
}
public Bitmap encode(QRCodeInfo bean) {
return encode(bean, SCAN_WIDTH, SCAN_HEIGHT);
}
public Bitmap encode(String data, int width, int height) {
QRCodeInfo bean = new QRCodeInfo(data, BarcodeFormat.QR_CODE);
return encode(bean, width, height);
}
public Bitmap encode(String data) {
return encode(data, SCAN_WIDTH, SCAN_HEIGHT);
}
}
public class QRCodeInfo implements Parcelable {
private String resultText;
private BarcodeFormat format;
public QRCodeInfo() {
}
public QRCodeInfo(String resultText, BarcodeFormat format) {
this.resultText = resultText;
this.format = format;
}
private QRCodeInfo(Parcel in) {
this.resultText = in.readString();
int tmpFormat = in.readInt();
this.format = tmpFormat == -1 ? null : BarcodeFormat.values()[tmpFormat];
}
public String getResultText() {
return resultText;
}
public void setResultText(String resultText) {
this.resultText = resultText;
}
public BarcodeFormat getFormat() {
return format;
}
public void setFormat(BarcodeFormat format) {
this.format = format;
}
public static final Creator<QRCodeInfo> CREATOR = new Creator<QRCodeInfo>() {
@Override
public QRCodeInfo createFromParcel(Parcel source) {
return new QRCodeInfo(source);
}
@Override
public QRCodeInfo[] newArray(int size) {
return new QRCodeInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.resultText);
dest.writeInt(this.format == null ? -1 : this.format.ordinal());
}
}