1.遇到的問題
需要生成一個二維碼,可以使用zxing第三方組件,增加依賴。
//生成二維碼 implementation 'com.google.zxing:core:3.4.1'
2.代碼?
- 展示頁面
<ImageViewandroid:id="@+id/qrCodeImageView"android:layout_width="150dp"android:layout_height="150dp"android:drawablePadding="16dp"android:background="@drawable/button_round_4"tools:layout_editor_absoluteX="176dp"tools:layout_editor_absoluteY="523dp" />
- 引用ImageView
ImageView qrCodeImageView;@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().getAttributes().systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE;setContentView(R.layout.activity_config);qrCodeImageView = findViewById(R.id.qrCodeImageView); }
- 創建二維碼方法?
使用了幾個方法,會出現亂碼,通過最后這這種方式解決?
private void create_QR_code() throws WriterException {QRCodeWriter qrCodeWriter = new QRCodeWriter();String text= "成績:1000 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三 \n姓名:張三";// 生成二維矩陣,編碼時指定大小,不要生成了圖片以后再進行縮放,這樣會模糊導致識別失敗Hashtable<EncodeHintType, String> hints = new Hashtable<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix matrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, 150, 150, hints);int width = matrix.getWidth();int height = matrix.getHeight();// 二維矩陣轉為一維像素數組,也就是一直橫著排了int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (matrix.get(x, y)) {pixels[y * width + x] = 0xff000000;}}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);// 通過像素數組生成bitmap,具體參考apibitmap.setPixels(pixels, 0, width, 0, 0, width, height);/*byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8);String utf8BytesString = new String(utf8Bytes, StandardCharsets.UTF_8);// 生成二維矩陣,編碼時指定大小,不要生成了圖片以后再進行縮放,這樣會模糊導致識別失敗Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix bitMatrix = qrCodeWriter.encode(utf8BytesString, BarcodeFormat.QR_CODE, 150, 150);Bitmap bitmap = Bitmap.createBitmap(150, 150, Bitmap.Config.RGB_565);for (int x = 0; x < 150; x++) {for (int y = 0; y < 150; y++) {bitmap.setPixel(x, y, bitMatrix.get(x, y) ? getResources().getColor(R.color.black) : getResources().getColor(R.color.colorAccent));}}*/ /* hashMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);//定義二維碼的糾錯級別,為LhashMap.put(EncodeHintType.CHARACTER_SET, "utf-8");//設置字符編碼為utf-8hashMap.put(EncodeHintType.MARGIN, 2);//設置margin屬性為2,也可以不設置String contents = "最簡單的Demo"; //定義二維碼的內容BitMatrix bitMatrix = null; //這個類是用來描述二維碼的,可以看做是個布爾類型的數組try {bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, 150, 150, hashMap);//調用encode()方法,第一次參數是二維碼的內容,第二個參數是生二維碼的類型,第三個參數是width,第四個參數是height,最后一個參數是hints屬性} catch (WriterException e) {e.printStackTrace();}int width = bitMatrix.getWidth();//獲取widthint height = bitMatrix.getHeight();//獲取heightint[] pixels = new int[width * height]; //創建一個新的數組,大小是width*heightfor (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {//通過兩層循環,為二維碼設置顏色if (bitMatrix.get(i, j)) {pixels[i * width + j] = Color.BLACK; //設置為黑色} else {pixels[i * width + j] = Color.WHITE; //設置為白色}}}//調用Bitmap的createBitmap(),第一個參數是width,第二個參數是height,最后一個是config配置,可以設置成RGB_565bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);//調用setPixels(),第一個參數就是上面的那個數組,偏移為0,x,y也都可為0,根據實際需求來,最后是width ,和heightbitmap.setPixels(pixels, 0, width, 0, 0, width, height);*///調用setImageBitmap()方法,將二維碼設置到imageview控件里qrCodeImageView.setImageBitmap(bitmap);}