1. 程式人生 > >Android二維碼生成

Android二維碼生成

roi fse black ima deb ecif character put isp

  最新在學習adnroid,遇到二維碼的生成與掃描在此做個整理

  貼下二維碼生成的工具類

  

  /**

   * 二維碼生成工具類

  */

  public class QRCodeUtil {

 /**

  * 生成二維碼 要轉換的地址或字符串,可以是中文

  * @param url

  * @param width

   * @param height

   * @return

   */

   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);

  

Android二維碼生成