1.首先导入依赖zxinglibrary 然后再Moudle依赖一下
考虑到安卓6.0的权限申请,使用到一个第三方的动态权限申请.
网址:https://github.com/yanzhenjie/AndPermission/blob/master/README-CN.md
导入依赖:
compile 'com.yanzhenjie:permission:1.1.0'
2.在需要使用相机,打电话的地方加入代码申请权限
// 在Activity: AndPermission.with(this) .requestCode(100) .permission(Permission.CAMERA) .start(); 3.跳转Activity,实现扫一扫功能.Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivity(intent);
/************************二维码的生成功能**************************/
如果上一个扫一扫你导入了Moudle ,那就不用在导入依赖啥了
1>.首先写一个工具类,可以生成各种二维码
public class QRCode { private static int IMAGE_HALFWIDTH = 50; /** * 生成二维码,默认大小为500*500 * * @param text 需要生成二维码的文字、网址等 * @return bitmap */ public static Bitmap createQRCode(String text) { return createQRCode(text, 500); } /** * 生成二维码 * * @param text 文字或网址 * @param size 生成二维码的大小 * @return bitmap */ public static Bitmap createQRCode(String text, int size) { try { Hashtable<EncodeHintType, String> hints = new Hashtable<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints); int[] pixels = new int[size * size]; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { if (bitMatrix.get(x, y)) { pixels[y * size + x] = 0xff000000; } else { pixels[y * size + x] = 0xffffffff; } } } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, size, 0, 0, size, size); return bitmap; } catch (WriterException e) { e.printStackTrace(); return null; } } /** * bitmap的颜色代替黑色的二维码 * * @param text * @param size * @param mBitmap * @return */ public static Bitmap createQRCodeWithLogo2(String text, int size, Bitmap mBitmap) { try { IMAGE_HALFWIDTH = size / 10; Hashtable<EncodeHintType, Object> hints = new Hashtable<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints); //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false); int[] pixels = new int[size * size]; int color = 0xffffffff; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { if (bitMatrix.get(x, y)) { pixels[y * size + x] = mBitmap.getPixel(x, y); } else { pixels[y * size + x] = color; } } } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, size, 0, 0, size, size); return bitmap; } catch (WriterException e) { e.printStackTrace(); return null; } } /** * bitmap作为底色 * * @param text * @param size * @param mBitmap * @return */ public static Bitmap createQRCodeWithLogo3(String text, int size, Bitmap mBitmap) { try { IMAGE_HALFWIDTH = size / 10; Hashtable<EncodeHintType, Object> hints = new Hashtable<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints); //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false); int[] pixels = new int[size * size]; int color = 0xfff92736; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { if (bitMatrix.get(x, y)) { pixels[y * size + x] = color; } else { pixels[y * size + x] = mBitmap.getPixel(x, y) & 0x66ffffff; } } } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, size, 0, 0, size, size); return bitmap; } catch (WriterException e) { e.printStackTrace(); return null; } } /** * 比方法2的颜色黑一些 * * @param text * @param size * @param mBitmap * @return */ public static Bitmap createQRCodeWithLogo4(String text, int size, Bitmap mBitmap) { try { IMAGE_HALFWIDTH = size / 10; Hashtable<EncodeHintType, Object> hints = new Hashtable<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints); //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false); int[] pixels = new int[size * size]; boolean flag = true; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { if (bitMatrix.get(x, y)) { if (flag) { flag = false; pixels[y * size + x] = 0xff000000; } else { pixels[y * size + x] = mBitmap.getPixel(x, y); flag = true; } } else { pixels[y * size + x] = 0xffffffff; } } } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, size, 0, 0, size, size); return bitmap; } catch (WriterException e) { e.printStackTrace(); return null; } } /** * 生成带logo的二维码 * @param text * @param size * @param mBitmap * @return */ public static Bitmap createQRCodeWithLogo5(String text, int size, Bitmap mBitmap) { try { IMAGE_HALFWIDTH = size / 10; Hashtable<EncodeHintType, Object> hints = new Hashtable<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints); //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false); int width = bitMatrix.getWidth();//矩阵高度 int height = bitMatrix.getHeight();//矩阵宽度 int halfW = width / 2; int halfH = height / 2; Matrix m = new Matrix(); float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth(); float sy = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getHeight(); m.setScale(sx, sy); //设置缩放信息 //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), m, false); int[] pixels = new int[size * size]; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH && y > halfH - IMAGE_HALFWIDTH && y < halfH + IMAGE_HALFWIDTH) { //该位置用于存放图片信息 //记录图片每个像素信息 pixels[y * width + x] = mBitmap.getPixel(x - halfW + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH); } else { if (bitMatrix.get(x, y)) { pixels[y * size + x] = 0xff37b19e; } else { pixels[y * size + x] = 0xffffffff; } } } } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, size, 0, 0, size, size); return bitmap; } catch (WriterException e) { e.printStackTrace(); return null; } } /** * 修改三个顶角颜色的,带logo的二维码 * @param text * @param size * @param mBitmap * @return */ public static Bitmap createQRCodeWithLogo6(String text, int size, Bitmap mBitmap) { try { IMAGE_HALFWIDTH = size / 10; Hashtable<EncodeHintType, Object> hints = new Hashtable<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); /* * 设置容错级别,默认为ErrorCorrectionLevel.L * 因为中间加入logo所以建议你把容错级别调至H,否则可能会出现识别不了 */ hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, size, size, hints); //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false); int width = bitMatrix.getWidth();//矩阵高度 int height = bitMatrix.getHeight();//矩阵宽度 int halfW = width / 2; int halfH = height / 2; Matrix m = new Matrix(); float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth(); float sy = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getHeight(); m.setScale(sx, sy); //设置缩放信息 //将logo图片按martix设置的信息缩放 mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), m, false); int[] pixels = new int[size * size]; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH && y > halfH - IMAGE_HALFWIDTH && y < halfH + IMAGE_HALFWIDTH) { //该位置用于存放图片信息 //记录图片每个像素信息 pixels[y * width + x] = mBitmap.getPixel(x - halfW + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH); } else { if (bitMatrix.get(x, y)) { pixels[y * size + x] = 0xff111111; if(x<115&&(y<115||y>=size-115)||(y<115&&x>=size-115)){ pixels[y * size + x] = 0xfff92736; } } else { pixels[y * size + x] = 0xffffffff; } } } } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, size, 0, 0, size, size); return bitmap; } catch (WriterException e) { e.printStackTrace(); return null; } } }
2.在点击事件里生成二维码,其实就是为ImageView设置BitMap
例如:
mImage.setImageBitmap(QRCode.createQRCodeWithLogo5(pathXiGua,500,drawableToBitmap(getResources().getDrawable(R.mipmap.ic_launcher))));第一个参数是一个网址,随意写了
第二个是生成图片的尺寸 ,特别修改可以看工具类里的设定
第三个参数是本地图片的BitMap 作为本二维码的Logo,这里是自定义的一个获取本地图片BitMap的方法.
public static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; }