先看效果:
	
輸入內容,點擊生成二維碼:
	
點擊logo圖案:
	
代碼:
QRCodeUtil:
package com.example.administrator.zxing;import android/99985.html">android.graphics.Bitmap;import android.graphics.Canvas;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.WriterException;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.QRCodeWriter;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import java.io.FileOutputStream;import java.io.IOException;import java.util.HashMap;import java.util.Map;public class QRCodeUtil {  public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {    try {      if (content == null || "".equals(content)) {        return false;      }      //配置參數      Map<EncodeHintType, Object> hints = new HashMap<>();      hints.put(EncodeHintType.CHARACTER_SET, "utf-8");      //容錯級別      hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);      //設置空白邊距的寬度//      hints.put(EncodeHintType.MARGIN, 2); //default is 4      // 圖像數據轉換,使用了矩陣轉換      BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);      int[] pixels = new int[widthPix * heightPix];      // 下面這里按照二維碼的算法,逐個生成二維碼的圖片,      // 兩個for循環是圖片橫列掃描的結果      for (int y = 0; y < heightPix; y++) {        for (int x = 0; x < widthPix; x++) {          if (bitMatrix.get(x, y)) {            pixels[y * widthPix + x] = 0xff000000;          } else {            pixels[y * widthPix + x] = 0xffffffff;          }        }      }      // 生成二維碼圖片的格式,使用ARGB_8888      Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);      bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);      if (logoBm != null) {        bitmap = addLogo(bitmap, logoBm);      }      //必須使用compress方法將bitmap保存到文件中再進行讀取。直接返回的bitmap是沒有任何壓縮的,內存消耗巨大!      return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));    } catch (WriterException | IOException e) {      e.printStackTrace();    }    return false;  }  /**   * 在二維碼中間添加Logo圖案   */  private static Bitmap addLogo(Bitmap src, Bitmap logo) {    if (src == null) {      return null;    }    if (logo == null) {      return src;    }    //獲取圖片的寬高    int srcWidth = src.getWidth();    int srcHeight = src.getHeight();    int logoWidth = logo.getWidth();    int logoHeight = logo.getHeight();    if (srcWidth == 0 || srcHeight == 0) {      return null;    }    if (logoWidth == 0 || logoHeight == 0) {      return src;    }    //logo大小為二維碼整體大小的1/5    float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;    Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);    try {      Canvas canvas = new Canvas(bitmap);      canvas.drawBitmap(src, 0, 0, null);      canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);      canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);      canvas.save(Canvas.ALL_SAVE_FLAG);      canvas.restore();    } catch (Exception e) {      bitmap = null;      e.getStackTrace();    }    return bitmap;  }}MainActivity:
package com.example.administrator.zxing;import android.content.Context;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.ImageView;import java.io.File;public class MainActivity extends AppCompatActivity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    //內容    final EditText contentET = (EditText) findViewById(R.id.create_qr_content);    //顯示二維碼圖片    final ImageView imageView = (ImageView) findViewById(R.id.create_qr_iv);    //是否添加Logo    final CheckBox addLogoCB = (CheckBox) findViewById(R.id.create_qr_addLogo);    Button createQrBtn = (Button) findViewById(R.id.create_qr_btn);    createQrBtn.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        final String filePath = getFileRoot(MainActivity.this) + File.separator            + "qr_" + System.currentTimeMillis() + ".jpg";        //二維碼圖片較大時,生成圖片、保存文件的時間可能較長,因此放在新線程中        new Thread(new Runnable() {          @Override          public void run() {            boolean success = QRCodeUtil.createQRImage(contentET.getText().toString().trim(), 800, 800,                addLogoCB.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.qr_logo) : null,                filePath);            if (success) {              runOnUiThread(new Runnable() {                @Override                public void run() {                  imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));                }              });            }          }        }).start();      }    });  }  //文件存儲根目錄  private String getFileRoot(Context context) {    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {      File external = context.getExternalFilesDir(null);      if (external != null) {        return external.getAbsolutePath();      }    }    return context.getFilesDir().getAbsolutePath();  }}布局:
activity_main:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.zxing.MainActivity"> <EditText android:id="@+id/create_qr_content" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/create_qr_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="生成二維碼" /> <CheckBox android:id="@+id/create_qr_addLogo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加logo圖案" /> </LinearLayout> <ImageView android:id="@+id/create_qr_iv" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
總結
以上所述是小編給大家介紹的Android 點擊生成二維碼功能實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!
新聞熱點
疑難解答