115 lines
4.4 KiB
Java
115 lines
4.4 KiB
Java
package com.gh.common.util;
|
||
|
||
import android.content.Context;
|
||
import android.graphics.Bitmap;
|
||
import android.graphics.BitmapFactory;
|
||
import android.widget.ImageView;
|
||
|
||
import com.gh.gamecenter.retrofit.Response;
|
||
import com.google.zxing.BarcodeFormat;
|
||
import com.google.zxing.EncodeHintType;
|
||
import com.google.zxing.WriterException;
|
||
import com.google.zxing.common.BitMatrix;
|
||
import com.google.zxing.qrcode.QRCodeWriter;
|
||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||
import com.lightgame.utils.Utils;
|
||
|
||
import java.io.File;
|
||
import java.io.FileOutputStream;
|
||
import java.io.IOException;
|
||
import java.util.HashMap;
|
||
import java.util.Map;
|
||
|
||
import rx.Observable;
|
||
import rx.Subscriber;
|
||
import rx.android.schedulers.AndroidSchedulers;
|
||
import rx.schedulers.Schedulers;
|
||
|
||
/**
|
||
* Created by khy on 2016/12/1.
|
||
*/
|
||
public class QRCodeUtils {
|
||
|
||
public static void setQRCode(final Context context, final String qrBody, final ImageView mShareQrCodeDv) {
|
||
Observable
|
||
.create(new Observable.OnSubscribe<String>() {
|
||
@Override
|
||
public void call(Subscriber<? super String> subscriber) {
|
||
String filePath = context.getExternalCacheDir().getPath() + "/ShareImg/ShareQRCode.jpg";
|
||
boolean success = QRCodeUtils.createQRImage(qrBody, 200, 200, filePath, context);
|
||
if (success) {
|
||
subscriber.onNext(filePath);
|
||
}
|
||
subscriber.onCompleted();
|
||
}
|
||
})
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Response<String>() {
|
||
@Override
|
||
public void onResponse(String response) {
|
||
super.onResponse(response);
|
||
mShareQrCodeDv.setImageBitmap(BitmapFactory.decodeFile(response));
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 生成二维码Bitmap
|
||
*
|
||
* @param content 内容
|
||
* @param widthPix 图片宽度
|
||
* @param heightPix 图片高度
|
||
* @param filePath 用于存储二维码图片的文件路径
|
||
* @return 生成二维码及保存文件是否成功
|
||
*/
|
||
private static boolean createQRImage(String content, int widthPix, int heightPix, String filePath, Context context) {
|
||
try {
|
||
if (content == null || "".equals(content)) {
|
||
return false;
|
||
}
|
||
|
||
//配置参数
|
||
Map<EncodeHintType, Object> hints = new HashMap<>();
|
||
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
|
||
//容错级别
|
||
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
|
||
//设置空白边距的宽度
|
||
hints.put(EncodeHintType.MARGIN, 0); //default is 4
|
||
// 图像数据转换,使用了矩阵转换
|
||
Utils.log("QRCode====" + content);
|
||
BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
|
||
int[] pixels = new int[widthPix * heightPix];
|
||
// 下面这里按照二维码的算法,逐个生成二维码的图片,
|
||
// 两个for循环是图片横列扫描的结果
|
||
for (int y = 0; y < heightPix; y++) {
|
||
for (int x = 0; x < widthPix; x++) {
|
||
if (bitMatrix.get(x, y)) {
|
||
pixels[y * widthPix + x] = 0xff000000;
|
||
} else {
|
||
pixels[y * widthPix + x] = 0xffffffff;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 生成二维码图片的格式,使用ARGB_8888
|
||
Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
|
||
bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
|
||
|
||
//检查上级路径
|
||
File file = new File(context.getExternalCacheDir().getPath() + "/ShareImg");
|
||
if (!file.exists()) {
|
||
file.mkdirs();
|
||
}
|
||
|
||
//必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
|
||
return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));
|
||
} catch (WriterException | IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
}
|