常用的二维码界面

常用的二维码界面_第1张图片
image.png

主要代码



    

        

        
            

                

                

            
            


            

                
            
            

            

                

                

            
        


        
            
            
            
                
            
        
    


二维码生成代码

     /*展示数据*/
            QRUrl = bean.getInfo().getLink();

//            int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
//            int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
//            img_QRcode.measure(w, h);
//            int height =img_QRcode.getMeasuredHeight();
//            int width =img_QRcode.getMeasuredWidth();
//            int width=ScreenUtils.getScreenHeight(getActivity());
            int width = DensityUtil.dp2px(getActivity(), 200);//px
            /*生成二维码*/
            mBitmap = QRCodeUtils.createQrCodeWithoutWhite(QRUrl, width, width);
            if(mBitmap !=null){
                img_QRcode.setImageBitmap(mBitmap);
            }

            countDown(9);



工具类
package com.example.rsq.qrcodescan;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.util.Log;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 二维码功能封装,包括识别,生成二维码,扫描识别二维码
 * @Author: renshiqian
 * @Date: 2017/12/13
 */

public class QRCodeUtils {
    /**
     * 生成二维码
     * @param str
     * @return
     */
    public static Bitmap encodeAsBitmap(String str){
        Bitmap bitmap = null;
        BitMatrix result = null;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 200, 200);
            // 使用 ZXing Android Embedded 要写的代码
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(result);
        } catch (WriterException e){
            e.printStackTrace();
        } catch (IllegalArgumentException iae){
            return null;
        }
        return bitmap;
    }

    /**
     * 识别相册图片二维码
     * @param bitmap
     * @return
     */
    public static Result scanBitmap(Bitmap bitmap) {
        if (bitmap == null) {
            return null;
        }
        Map hints = new LinkedHashMap<>();
        hints.put(DecodeHintType.CHARACTER_SET, "UTF8");// 解码设置编码方式为:utf-8
        hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);//优化精度
        hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);//复杂模式,开启PURE_BARCODE模式
        Bitmap scanBitmap = Bitmap.createBitmap(bitmap);
        int px[] = new int[scanBitmap.getWidth() * scanBitmap.getHeight()];
        scanBitmap.getPixels(px, 0, scanBitmap.getWidth(), 0, 0, scanBitmap.getWidth(), scanBitmap.getHeight());
        RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap.getWidth(), scanBitmap.getHeight(), px);
        BinaryBitmap tempBitmap = new BinaryBitmap(new HybridBinarizer(source));
        MultiFormatReader reader = new MultiFormatReader();
        try {
            return reader.decode(tempBitmap, hints);
        } catch (NotFoundException e) {
            Log.wtf("zcc", "scan:" + e.toString());
        } finally {
            reader.reset();
        }
        return null;
    }

    public static String recode(String str) {
        String formart = "";
        try {
            boolean ISO = Charset.forName("ISO-8859-1").newEncoder().canEncode(str);
            if (ISO) {
                formart = new String(str.getBytes("ISO-8859-1"), "GB2312");
            } else {
                formart = str;
            }
        } catch (UnsupportedEncodingException e) {
            Log.wtf("zcc", "scan recode:" + e.toString());
        }
        return formart;
    }

    /**
     * 扫描二维码
     * @param activity
     * 请重写当前activity的onActivityResult()方法
     * resultCode == RESULT_OK = -1 为成功扫描二维码
     * Bundle bundle = data.getExtras();
     * String scanResult = bundle.getString("result");为扫描结果
     */
    public static void scanQRCode(Activity activity){
        // 创建IntentIntegrator对象
        IntentIntegrator intentIntegrator = new IntentIntegrator(activity);
        // 设置自定义扫描Activity
        intentIntegrator.setCaptureActivity(CustomCaptureActivity.class);
        // 开始扫描
        intentIntegrator.initiateScan();

    }


    /**
     * 生成不带白边的二维码
     * @param str
     * @param width
     * @param height
     * @return
     */
    public static Bitmap createQrCodeWithoutWhite(String str, int width, int height) {
        try {
            Hashtable hints = new Hashtable();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix matrix = new QRCodeWriter().encode(str, BarcodeFormat.QR_CODE, width, height);
            matrix = deleteWhite(matrix);//删除白边
            width = matrix.getWidth();
            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] = Color.BLACK;
                    } else {
                        pixels[y * width + x] = Color.WHITE;
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        } catch (Exception e) {
            return null;
        }
    }


    /**
     * 生成带白边的二维码
     * @param str
     * @param width
     * @param height
     * @return
     */
    public static Bitmap createQrCodeWithWhite(String str, int width, int height) {
        Bitmap bitmap = null;
        BitMatrix result = null;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, width, height);
            // 使用 ZXing Android Embedded 要写的代码
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(result);
        } catch (WriterException e){
            e.printStackTrace();
        } catch (IllegalArgumentException iae){
            return null;
        }
        return bitmap;
    }


    private static BitMatrix deleteWhite(BitMatrix matrix) {
        int[] rec = matrix.getEnclosingRectangle();
        int resWidth = rec[2] + 1;
        int resHeight = rec[3] + 1;

        BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
        resMatrix.clear();
        for (int i = 0; i < resWidth; i++) {
            for (int j = 0; j < resHeight; j++) {
                if (matrix.get(i + rec[0], j + rec[1]))
                    resMatrix.set(i, j);
            }
        }
        return resMatrix;
    }
}

你可能感兴趣的:(常用的二维码界面)