当前位置:主页 > android教程 > Android二维码扫描生成

Android中二维码的扫描和生成(使用zxing库)

发布:2023-03-04 18:00:01 59


给大家整理了相关的编程文章,网友闻立轩根据主题投稿了本篇教程内容,涉及到Android生成二维码、android二维码识别、android、二维码扫描、Android二维码扫描生成相关内容,已被841网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

Android二维码扫描生成

一.zxing是什么?

zxing是google推出的一个开源的二维码框架,可以实现使用手机的摄像头完成二维码的扫描和解码

二.集成zxing框架

1. 将获取的jar包复制到工程的app/libs目录下,刷新,然后去添加依赖

2. 集成java源码,将demo工程QrScan中app/src/main/java/目录下包中的zxing和util复制到此工程对应的app/src/main/java的包下

3. 修改package包名,修改import路径,修改类包名

4. 同步资源,复制资源目录

drawable:btn_back.png    flash_off.png    flash_on.png

layout:复制activity_capture.xml,activity_scanner.xml,toolbar_scanner.xml

raw:全部复制

values:复制 / 替换其中的attrs.xml,ids.xml,colors.xml

5.修改工具栏框架包和ViewFinderView包路径

6.打开开发权限,在清单文件中添加开发权限

    
    
    
    
    
    

7.最后运行一下工程,如果没报错的话就成功了

三.界面设计

activity_main.xml代码如下:


 
    
 

 

 

content.xml代码如下:


 

 

四.二维码生成

创建类CreateUtil,并编写createQRCode()方法来实现

public class CreateUtil {
    //String codestring:要生成二维码的字符串
    // int width:二维码图片的宽度
    // int height:二维码图片的高度
    public static Bitmap createQRCode(String codestring,int width,int height){
        try {
            //首先判断参数的合法性,要求字符串内容不能为空或图片长宽必须大于0
            if (TextUtils.isEmpty(codestring)||width<=0||height<=0){
                return null;
            }
            //设置二维码的相关参数,生成BitMatrix(位矩阵)对象
            Hashtable hashtable=new Hashtable<>();
            hashtable.put(EncodeHintType.CHARACTER_SET,"utf-8");  //设置字符转码格式
            hashtable.put(EncodeHintType.ERROR_CORRECTION,"H");   //设置容错级别
            hashtable.put(EncodeHintType.MARGIN,"2"); //设置空白边距
            //encode需要抛出和处理异常
            BitMatrix bitMatrix=new QRCodeWriter().encode(codestring, BarcodeFormat.QR_CODE,width,height,hashtable);
            //再创建像素数组,并根据位矩阵为数组元素赋颜色值
            int[] pixel=new int[width*width];
            for (int h=0;h

在MainActivity中编写代码——生成二维码

//点击开始生成按钮监听事件
startBt1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String input=inputEt.getText().toString();  //获取用户输入的字符串  
        //调用CreateUtil类生成二维码后显示在界面上
        contentIv.setImageBitmap(CreateUtil.createQRCode(input,contentIv.getWidth(),contentIv.getHeight()));
    }
});

五.二维码扫描

MainActivity中编写代码

        //开始扫描按钮点击事件监听
        startBt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                scanQRCode();
            }
        });
    
 
 
 
    //实现扫描二维码的方法
    private void scanQRCode() {
        //申请相机权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);
            return;
        }
        //申请文件(相册)读写权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQ_PERM_EXTERNAL_STORAGE);
            return;
        }
        //二维码扫码
        //然后通过Intent机制启动zxing框架的CaptureActivity,请求返回结果
        Intent intent = new Intent(this, CaptureActivity.class);
        startActivityForResult(intent, Constant.REQ_QR_CODE);
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //扫描结果回调
        if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);
            //将扫描出的信息显示出来
            resultTv.setText(scanResult);
        }
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case Constant.REQ_PERM_CAMERA:
                //摄像头权限申请
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //获得授权
                    scanQRCode();
                } else {
                    //被禁止授权
                    Toast.makeText(this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).show();
                }
                break;
            case Constant.REQ_PERM_EXTERNAL_STORAGE:
                //文件读写权限申请
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //获得授权
                    scanQRCode();
                } else {
                    //被禁止授权
                    Toast.makeText(this, "请至权限中心打开本应用的文件读写权限", Toast.LENGTH_LONG).show();
                }
                break;
        }
    }
}

到此,一个简易的二维码生成与扫描就完成了

附:Android使用Zxing识别图片多个二维码

android通过zxing可识别bitmap多个二维码,具体使用如下

1.首先build文件添加依赖

implementation 'com.google.zxing:core:3.3.3'

2.使用 QRCodeMultiReader 来解析 Bitmap获取Result数组(二维码图片地址集合)

 public static com.google.zxing.Result[] decodeQR(Bitmap srcBitmap) {
        com.google.zxing.Result[] result = null;
        if (srcBitmap != null) {
            int width = srcBitmap.getWidth();
            int height = srcBitmap.getHeight();
            int[] pixels = new int[width * height];
            srcBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
            // 新建一个RGBLuminanceSource对象
            RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
            // 将图片转换成二进制图片
            BinaryBitmap binaryBitmap = new BinaryBitmap(new    
            GlobalHistogramBinarizer(source));
            QRCodeMultiReader reader = new QRCodeMultiReader();// 初始化解析对象
            try {
                result = reader.decodeMultiple(binaryBitmap, 
                CodeHintsUtils.getDefaultDecodeHints());// 解析获取一个Result数组
            } catch (NotFoundException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

3.通过获取数组下的Result对象,result.getText();//得到二维码信息地址

总结

到此这篇关于Android中二维码扫描和生成(使用zxing库)的文章就介绍到这了,更多相关Android二维码扫描生成内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • Android neon 优化实践示例

    发布:2023-03-04

    这篇文章主要为大家介绍了Android neon 优化实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android NDK 开发中 SO 包大小压缩方法详解

    发布:2023-03-04

    这篇文章主要为为大家介绍了Android NDK 开发中 SO 包大小压缩方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android 性能优化实现全量编译提速的黑科技

    发布:2023-03-04

    这篇文章主要为大家介绍了Android 性能优化实现全量编译提速的黑科技,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android实现图片上传蒙层进度条

    发布:2023-03-09

    这篇文章主要为大家详细介绍了Android实现图片上传蒙层进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Android Handler源码深入探究

    发布:2023-03-03

    handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message


  • Android布局ConstraintLayout代码修改约束及辅助功能

    发布:2023-03-13

    这篇文章主要为大家介绍了Android布局ConstraintLayout代码修改约束及辅助功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android实现简易的闹钟功能

    发布:2023-03-08

    这篇文章主要为大家详细介绍了Android实现简易的闹钟功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • 务必掌握的Android十六进制状态管理最佳实践

    发布:2023-03-13

    这篇文章主要为大家介绍了务必掌握的Android十六进制状态管理最佳实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


网友讨论