Android二维码生成

Posted revolve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android二维码生成相关的知识,希望对你有一定的参考价值。

  最新在学习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二维码生成的主要内容,如果未能解决你的问题,请参考以下文章

玩转Android之二维码生成与识别

Android生成二维码

Android Studio 扫描识别二维码(包含闪光灯和本地二维码)生成二维码生成带logo的二维码

Android之扫描二维码和根据输入信息生成名片二维码

Android_demo之生成二维码

android 生成的二维码图片如何保存到sdcard?