Android二维码生成

风流不在谈锋胜,袖手无言味最长。这篇文章主要讲述Android二维码生成相关的知识,希望能为你提供帮助。
最新在学习adnroid,遇到二维码的生成与扫描在此做个整理
贴下二维码生成的工具类
 

/**
  * 二维码生成工具类
  */
public class QRCodeUtil {
/**
      * 生成二维码 要转换的地址或字符串,可以是中文
      * @param url
      * @param width
      * @param height
      * @return
      */
【Android二维码生成】    public static Bitmap createQRImage(String url, final int width, final int height) {
        try {
            // 判断URL合法性
            if (url == null || "".equals(url) || url.length() < 1) {
                return null;
            }
            Hashtable< EncodeHintType, String> hints = new Hashtable< EncodeHintType, String> ();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = new QRCodeWriter().encode(url,
                    BarcodeFormat.QR_CODE, width, height, hints);
            int[] pixels = new int[width * height];
            // 下面这里按照二维码的算法,逐个生成二维码的图片,
            // 两个for循环是图片横列扫描的结果
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * width + x] = 0xff000000;
                    } else {
                        pixels[y * width + x] = 0xffffffff;
                    }
                }
            }
            // 生成二维码图片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(width, height,Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
      * 生成条形码
      *
      * @param context
      * @param contents
      *            需要生成的内容
      * @param desiredWidth
      *            生成条形码的宽带
      * @param desiredHeight
      *            生成条形码的高度
      * @param displayCode
      *            是否在条形码下方显示内容
      * @return
      */
    public static Bitmap creatBarcode(Context context, String contents,int desiredWidth, int desiredHeight, boolean displayCode) {
        Bitmap ruseltBitmap = null;
        /**
          * 图片两端所保留的空白的宽度
          */
        int marginW = 20;
        /**
          * 条形码的编码类型
          */
        BarcodeFormat barcodeFormat = BarcodeFormat.CODE_128;
 
        if(displayCode){
            Bitmap barcodeBitmap = encodeAsBitmap(contents, barcodeFormat,desiredWidth, desiredHeight);
            Bitmap codeBitmap = creatCodeBitmap(contents, desiredWidth + 2 * marginW, desiredHeight, context);
            ruseltBitmap = mixtureBitmap(barcodeBitmap, codeBitmap, new PointF(0, desiredHeight));
        }else{
            ruseltBitmap = encodeAsBitmap(contents, barcodeFormat,desiredWidth, desiredHeight);
        }
 
        return ruseltBitmap;
    }
 
    /**
      * 生成条形码的Bitmap
      *
      * @param contents
      *            需要生成的内容
      * @param format
      *            编码格式
      * @param desiredWidth
      * @param desiredHeight
      * @return
      * @throws WriterException
      */
    protected static Bitmap encodeAsBitmap(String contents,BarcodeFormat format, int desiredWidth, int desiredHeight) {
        final int WHITE = 0xFFFFFFFF;
        final int BLACK = 0xFF000000;
 
        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix result = null;
        try {
            result = writer.encode(contents, format, desiredWidth,
                    desiredHeight, null);
        } catch (WriterException e) {
            e.printStackTrace();
        }
 
        int width = result.getWidth();
        int height = result.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
            }
        }
 
        Bitmap bitmap = Bitmap.createBitmap(width, height,Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }
 
    /**
      * 生成显示编码的Bitmap
      * @param contents
      * @param width
      * @param height
      * @param context
      * @return
      */
    protected static Bitmap creatCodeBitmap(String contents, int width,int height, Context context) {
        TextView tv = new TextView(context);
        LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        tv.setLayoutParams(layoutParams);
        tv.setText(contents);
        tv.setHeight(height);
        tv.setGravity(Gravity.CENTER_HORIZONTAL);
        tv.setWidth(width);
        tv.setDrawingCacheEnabled(true);
        tv.setTextColor(Color.BLACK);
        tv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
        tv.buildDrawingCache();
        Bitmap bitmapCode = tv.getDrawingCache();
        return bitmapCode;
    }
 
    /**
      * 将两个Bitmap合并成一个
      * 
      * @param first
      * @param second
      * @param fromPoint
      *          第二个Bitmap开始绘制的起始位置(相对于第一个Bitmap)
      * @return
      */
    protected static Bitmap mixtureBitmap(Bitmap first, Bitmap second,PointF fromPoint){
        if (first == null || second == null || fromPoint == null) {
            return null;
        }
        int marginW = 20;
        Bitmap newBitmap = Bitmap.createBitmap(first.getWidth() + second.getWidth() + marginW,first.getHeight() + second.getHeight(), Config.ARGB_4444);
        Canvas cv = new Canvas(newBitmap);
        cv.drawBitmap(first, marginW, 0, null);
        cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);
        cv.save(Canvas.ALL_SAVE_FLAG);
        cv.restore();
  return newBitmap;
    }
}


在activity中直接使用即可
//第一个参数要生成二维码的字符串
Bitmap qrBitmap = QRCodeUtil.createQRImage("Revolve",400, 400);
//iv表示在xml中imageview的id
iv.setImageBitmap(qrBitmap);    

 

    推荐阅读