首先需要下载 core-x.x.x.jar文件并依赖。
public class MainActivity extends AppCompatActivity { private ImageView ivQrCode; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivQrCode = (ImageView) findViewById(R.id.iv_qr_code); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { click(); } }); } private void click() { //生成二维码 Bitmap qrCodeBitmap = generateBitmap(MainActivity.this, "这里是二维码的内容", 100, 100); //生成二维码中需要显示的图标 Bitmap logoBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round); //生成带图标的二维码 Bitmap qrCodeWithLogo = addLogo(qrCodeBitmap, logoBitmap); ivQrCode.setImageBitmap(qrCodeWithLogo); } //这个是生成二维码的Bitmap public Bitmap generateBitmap(Context context, String content, int widthDp, int heightDp) { int width = DensityUtils.dip2px(context, widthDp); int height = DensityUtils.dip2px(context, heightDp); QRCodeWriter qrCodeWriter = new QRCodeWriter(); Map<EncodeHintType, String> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); try { BitMatrix encode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints); int[] pixels = new int[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (encode.get(j, i)) { pixels[i * width + j] = 0x00000000; } else { pixels[i * width + j] = 0xffffffff; } } } return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565); } catch (WriterException e) { e.printStackTrace(); } return null; } //给二维码加上图标 public Bitmap addLogo(Bitmap qrBitmap, Bitmap logoBitmap) { int qrBitmapWidth = qrBitmap.getWidth(); int qrBitmapHeight = qrBitmap.getHeight(); int logoBitmapWidth = logoBitmap.getWidth(); int logoBitmapHeight = logoBitmap.getHeight(); Bitmap blankBitmap = Bitmap.createBitmap(qrBitmapWidth, qrBitmapHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(blankBitmap); canvas.drawBitmap(qrBitmap, 0, 0, null); canvas.save(Canvas.ALL_SAVE_FLAG); float scaleSize = 1.0f; while ((logoBitmapWidth / scaleSize) > (qrBitmapWidth / 5) || (logoBitmapHeight / scaleSize) > (qrBitmapHeight / 5)) { scaleSize *= 2; } float sx = 1.0f / scaleSize; canvas.scale(sx, sx, qrBitmapWidth / 2, qrBitmapHeight / 2); canvas.drawBitmap(logoBitmap, (qrBitmapWidth - logoBitmapWidth) / 2, (qrBitmapHeight - logoBitmapHeight) / 2, null); canvas.restore(); return blankBitmap; } }
DensityUtils类的代码内容是:
public class DensityUtils { private static final float DOT_FIVE = 0.5f; /** * dip to px * * @param context * @param dip * @return */ public static int dip2px(Context context, float dip) { float density = getDensity(context); return (int) (dip * density + DensityUtils.DOT_FIVE); } /** * px to dip * * @param context * @param px * @return */ public static int px2dip(Context context, float px) { float density = getDensity(context); return (int) (px / density + DOT_FIVE); } private static DisplayMetrics sDisplayMetrics; /** * get screen width * * @param context * @return */ public static int getDisplayWidth(Context context) { initDisplayMetrics(context); return sDisplayMetrics.widthPixels; } /** * get screen height * * @param context * @return */ public static int getDisplayHeight(Context context) { initDisplayMetrics(context); return sDisplayMetrics.heightPixels; } /** * get screen density * * @param context * @return */ public static float getDensity(Context context) { initDisplayMetrics(context); return sDisplayMetrics.density; } /** * get screen density dpi * * @param context * @return */ public static int getDensityDpi(Context context) { initDisplayMetrics(context); return sDisplayMetrics.densityDpi; } /** * init display metrics * * @param context */ private static synchronized void initDisplayMetrics(Context context) { sDisplayMetrics = context.getResources().getDisplayMetrics(); } /** * is landscape * * @param context * @return */ public static boolean isLandscape(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } /** * is portrait * * @param context * @return */ public static boolean isPortrait(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; } /** * get status height * * @param context * @return */ public static int getStatusHeight(Context context) { int statusHeight = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height") .get(object).toString()); statusHeight = context.getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusHeight; } }