效果图
导入依赖包链接: https://pan.baidu.com/s/1Xh08yttbd4btOvHj6fZRZg 提取码: ifis
下载之后解压,然后将文件Import module进项目
/**
* 二维码生成工具类
*/
public class EncodingUtils {
/**
* 创建二维码
*
* @param content content
* @param widthPix widthPix
* @param heightPix heightPix
* @param logoBm logoBm
* @return 二维码
*/
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm,int fontColor,int backColor) {
try {
if (content == null || "".equals(content)) {
return null;
}
// 配置参数
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 容错级别
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 1);
// 图像数据转换,使用了矩阵转换
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 (x < 1.1*widthPix / 3 && y < 1.1*heightPix / 3||x < widthPix / 2.8 && y > 1.9*heightPix / 3||x > 1.9*widthPix / 3 && y < 1.1*heightPix / 3) {
if (bitMatrix.get(x, y)) {
pixels[y * widthPix + x] =fontColor;
} else {
pixels[y * widthPix + x] = Color.WHITE;
}
}else {
if (bitMatrix.get(x, y)) {
pixels[y * widthPix + x] = backColor;// 绿色
} else {
pixels[y * widthPix + x] = Color.WHITE;
}
}
}
}
// 生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
if (logoBm != null) {
bitmap = addLogo(bitmap, logoBm);
}
//必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
public static Bitmap addBackground(Bitmap foreground,Bitmap background){
int fgWidth = foreground.getWidth();
int fgHeight = foreground.getHeight();
int bgWidth=background.getWidth();
int bgHeight=background.getHeight();
Bitmap newmap = Bitmap
.createBitmap(fgWidth, fgHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newmap);
canvas.drawBitmap(background, 0, 0, null);
canvas.drawBitmap(foreground, 0, 0, null);
canvas.save();
canvas.restore();
return newmap;
}
/**
* 在二维码中间添加Logo图案
*/
private static Bitmap addLogo(Bitmap src, Bitmap logo) {
if (src == null) {
return null;
}
if (logo == null) {
return src;
}
//获取图片的宽高
int srcWidth = src.getWidth();
int srcHeight = src.getHeight();
int logoWidth = logo.getWidth();
int logoHeight = logo.getHeight();
if (srcWidth == 0 || srcHeight == 0) {
return null;
}
if (logoWidth == 0 || logoHeight == 0) {
return src;
}
//logo大小为二维码整体大小的1/5
float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
try {
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(src, 0, 0, null);
canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
canvas.save();
canvas.restore();
} catch (Exception e) {
bitmap = null;
e.getStackTrace();
}
return bitmap;
}
}
这是将libzxing源码做修改,多传入了两个参数控制颜色,以下是调用
EncodingUtils.createQRCode(etContent, 500, 500, bitmapFormResources, frontColor, backColor);
bitmapFormResources是二维码中间小图标,类型为bitmap,frontColor是前景色,backColor后景色
颜色为16进制颜色 如白色为OXFFFFFFFF,黑色为0XFF000000
这个本地包里写入了闪光灯的开关
//开闪光灯
private void openLight() {
camera = CameraManager.getCamera();//我们先前在CameraManager类中添加的静态方法
params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
ivFlashLight.setImageResource(R.mipmap.flash_close);
isOpen = true;
}
//关闪光灯
private void closeLight(){
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
ivFlashLight.setImageResource(R.drawable.flish_light_scan);
isOpen = false;
}
打开相册选取二维码
//打开相册
private void open_picture(){
Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
innerIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(innerIntent, "请选择二维码图片");
CaptureActivity.this.startActivityForResult(wrapperIntent, REQUEST_CODE_SCAN_GALLERY);
}
需要动态申请权限 ActivityCompat.requestPermissions(CaptureActivity.this
, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
在MyAsyncTask 里做了扫描结果回调处理
Intent resultIntent = new Intent();
resultIntent.putExtra("result",result);
captureActivity.setResult(0033, resultIntent);
captureActivity.finish();
result是扫描结果