当前位置: 首页 > article >正文

Android studio生成二维码

1.遇到的问题

需要生成一个二维码,可以使用zxing第三方组件,增加依赖。

//生成二维码
implementation 'com.google.zxing:core:3.4.1'

2.代码 

  • 展示页面
<ImageView
    android: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,具体参考api
        bitmap.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);
        //定义二维码的纠错级别,为L
        hashMap.put(EncodeHintType.CHARACTER_SET, "utf-8");
        //设置字符编码为utf-8
        hashMap.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();//获取width
        int height = bitMatrix.getHeight();//获取height
        int[] pixels = new int[width * height]; //创建一个新的数组,大小是width*height
        for (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_565
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        //调用setPixels(),第一个参数就是上面的那个数组,偏移为0,x,y也都可为0,根据实际需求来,最后是width ,和height
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);*/
        //调用setImageBitmap()方法,将二维码设置到imageview控件里
        qrCodeImageView.setImageBitmap(bitmap);


    }


http://www.kler.cn/a/163402.html

相关文章:

  • 如何在 Spring Boot 中实现多数据源的事务管理?
  • CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳
  • 「C/C++」C++ STL容器库 之 std::map 键值容器类
  • 网站访问在TCP/IP四层模型中的流程
  • 嵌入式linux中PWM控制与实现
  • Java与HTML:构建静态网页
  • 浅谈前端代码里的命名规范与注释
  • 大一C语言作业 12.8
  • 图片处理OpenCV IMDecode模式说明【生产问题处理】
  • Qt工程文件分离、Qtimer定时器、Qt Creator 常用快捷键
  • jsp 个人网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • Hazel引擎学习(十二)
  • C++初阶-string类的模拟实现
  • Linux中的文件系统
  • 26、pytest使用allure解读
  • 12.8 作业
  • 基于ssm志愿者招募网站源码和论文
  • JS中call()、apply()、bind()改变this指向的原理
  • Ultimate VFX
  • css中2D和3D的区别
  • ELK(五)—集群搭建
  • Linux--学习记录(2)
  • Web学习路线
  • 【ET8】0.ET8入门-ET框架介绍
  • 交付《啤酒游戏经营决策沙盘》的项目
  • vue2 el-input里实现打字机 效果