常用的二维码界面

image.png

主要代码

<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:id="@+id/fl_custom_detail_time"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginLeft="@dimen/margin10"
        android:layout_marginRight="@dimen/margin10"
        android:layout_weight="1"
        android:orientation="vertical"
        android:background="@color/colorffffff"
        android:layout_marginBottom="@dimen/margin12"
        android:visibility="visible">

        <TextView
            android:id="@+id/tv_default"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="请先填写下方增员对象分类"
            android:textColor="@color/color666666"
            android:textSize="@dimen/text15"
            android:visibility="gone" />

        <android.support.constraint.ConstraintLayout
            android:id="@+id/cl_tl"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorffffff"
            android:visibility="visible">
            <LinearLayout
                android:id="@+id/ll_add_staff_tishi"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dimen_30dp"
                android:gravity="center_vertical"
                android:background="@color/colorffeacc"
                android:orientation="horizontal">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/margin10"
                    android:background="@mipmap/tishi" />

                <TextView
                    android:id="@+id/tv_add_staff_tishi"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/margin10"
                    android:textSize="@dimen/text10"
                    android:textColor="@color/colorff5300"
                    android:text="二维码仅限此准增员扫描,请勿多人使用。"
                    />

            </LinearLayout>
            <TextView
                android:id="@+id/tv_tl"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:paddingTop="@dimen/margin10"
                android:paddingBottom="@dimen/margin10"
                android:text="二维码有效期为10秒,请及时完成扫码"
                app:layout_constraintLeft_toLeftOf="parent"
                android:textColor="@color/color333333"
                app:layout_constraintTop_toBottomOf="@+id/ll_add_staff_tishi"
                app:layout_constraintRight_toRightOf="parent" />


            <FrameLayout
                android:id="@+id/fl_QRcode"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:background="@drawable/shape_add_staff_qrcode"
                android:clickable="true"
                app:layout_constraintBottom_toTopOf="@+id/ll_time"
                app:layout_constraintDimensionRatio="w,1:1"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv_tl"
                >

                <ImageView
                    android:id="@+id/img_QRcode"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_margin="@dimen/margin2"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    />
            </FrameLayout>
            <TextView
                android:id="@+id/tv_bl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/add_staff_shuanxin"
                android:drawablePadding="@dimen/margin6"
                android:gravity="center"
                android:paddingTop="@dimen/margin10"
                android:paddingBottom="@dimen/margin10"
                android:text="更新状态"
                android:visibility="visible"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                android:textColor="@color/color333333"
                app:layout_constraintRight_toRightOf="parent" />

            <LinearLayout
                android:id="@+id/ll_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:paddingTop="@dimen/margin10"
                android:visibility="visible"
                app:layout_constraintBottom_toTopOf="@+id/tv_bl"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:drawableRight="@mipmap/add_staff_shijian"
                    android:drawablePadding="@dimen/margin10"
                    android:text="请扫描二维码"
                    android:textColor="@color/color999999"
                    android:textSize="@dimen/text14" />

                <TextView
                    android:id="@+id/tv_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/margin10"
                    android:drawablePadding="@dimen/margin7"
                    android:text="10s"
                    android:textColor="@color/colorff5722"
                    android:textSize="@dimen/text14" />

            </LinearLayout>
        </android.support.constraint.ConstraintLayout>


        <android.support.constraint.ConstraintLayout
            android:id="@+id/cl_tl2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorffffff"
            android:visibility="gone">
            <TextView
                android:id="@+id/tv_tl2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:paddingTop="@dimen/margin10"
                android:paddingBottom="@dimen/margin10"
                android:text="二维码有效期为10秒,请及时完成扫码"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent" />
            <TextView
                android:id="@+id/tv_bl2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:drawablePadding="@dimen/margin6"
                android:gravity="center"
                android:paddingTop="@dimen/margin10"
                android:paddingBottom="@dimen/margin10"
                android:text="二维码已失效,请重试!"
                android:visibility="visible"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent" />
            <FrameLayout
                android:id="@+id/fl_QRcode2"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:background="@drawable/shape_add_staff_qrcode"
                android:clickable="true"
                app:layout_constraintBottom_toTopOf="@+id/tv_bl2"
                app:layout_constraintTop_toBottomOf="@+id/tv_tl2"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintDimensionRatio="w,1:1"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:drawableTop="@mipmap/add_staff_shuaxin2"
                    android:drawablePadding="@dimen/margin20"
                    android:text="重新生成二维码" />
            </FrameLayout>
        </android.support.constraint.ConstraintLayout>
    </FrameLayout>
</LinearLayout>

二维码生成代码

     /*展示数据*/
            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<DecodeHintType, Object> 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<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
            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;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 二维码在目前我们生活中是太常见了,扫码登陆、扫码支付、加好友......二维码又称QR Code,是一个在移...
    MrYun阅读 17,733评论 1 17
  • 早上好!静暖人生:每日一句正能量[玫瑰][玫瑰][玫瑰] (2018年10月15日 农历九月初七 星期一) 懂因果...
    侠姐27687阅读 331评论 0 2
  • 如果你问我,余生你怕什么? 我会告诉你 我最怕没有你陪我一起。 2017年11月4日 星期六 阴 文/小嗳 ...
    忘忧姑娘阅读 691评论 2 3
  • 我若有喜欢的人,从来都藏的很好。 不用疏离,也不会逾距。 只悄悄看着你与你心尖之人琴瑟和弦,面上微笑,风平浪静,心...
    禹二然阅读 92评论 0 1
  • 文/云端一梦 小时候,常看夜空神话故事里长大的我希望自己有对翅膀 夜晚一颗星星闪烁一下我知道她有话对我说天外有来客...
    云端一梦l阅读 3,023评论 84 98

友情链接更多精彩内容