Android中二维码的扫描与生成(zxing库)

目录

一.zxing是什么?

二.集成zxing框架

         三.界面设计

四.二维码生成​​​​​​​

五.二维码扫描


一.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.打开开发权限,在清单文件中添加开发权限

    <!--摄像机权限-->
    <uses-permission android:name="android.permission.CAMERA" />
    <!--手机震动权限-->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!--读取本地图片权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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

三.界面设计

activity_main.xml代码如下:

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</com.google.android.material.appbar.AppBarLayout>

<include layout="@layout/content_main" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    app:srcCompat="@android:drawable/ic_dialog_email" />

content.xml代码如下:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="48dp"
    android:hint="扫描结果"
    android:textSize="24sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/myScanButton"
    app:layout_constraintVertical_bias="0.0" />

<EditText
    android:id="@+id/myEditText"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:ems="10"
    android:hint="输入要生成二维码的字符"
    android:inputType="textPersonName"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/myCreateButton"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="开始生成"
    android:textSize="18sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/myEditText" />

<ImageView
    android:id="@+id/myImageView"
    android:layout_width="202dp"
    android:layout_height="196dp"
    android:layout_marginTop="64dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.497"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/myCreateButton"
    app:srcCompat="@android:drawable/screen_background_light_transparent" />

<Button
    android:id="@+id/myScanButton"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="36dp"
    android:text="开始扫描"
    android:textSize="18sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/myImageView" />

四.二维码生成

创建类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<EncodeHintType,String> 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<height;h++){
                for (int w=0;w<width;w++){
                    if (bitMatrix.get(w,h)){
                        pixel[h*width+w]= Color.BLACK;  //设置黑色色块
                    }else{
                        pixel[h*width+w]=Color.WHITE;  //设置白色色块
                    }
                }
            }
            //创建bitmap对象
            //根据像素数组设置Bitmap每个像素点的颜色值,之后返回Bitmap对象
            Bitmap qrcodemap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
            qrcodemap.setPixels(pixel,0,width,0,0,width,height);
            return qrcodemap;
        }catch (WriterException e){
            return null;
        }
    }
}

在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;
        }
    }
}

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

要是有疑问大家可以加我微信详聊 yf1553653788

  • 24
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
Android Studio使用二维码扫描生成功能需要借助zxing.jar包。zxing是一个开源的二维码处理,可以实现二维码的扫描生成。 首先,我们需要将zxing.jar包添加到我们的Android Studio项目。可以通过两种方式来导入这个。一种方式是将zxing.jar包拷贝到app/libs目录下,然后在build.gradle文件添加依赖。另一种方式是通过在build.gradle文件的dependencies添加远程依赖来导入。如下所示: ``` dependencies { implementation 'com.google.zxing:core:3.4.1' } ``` 导入zxing.jar包后,我们就可以使用其的类和方法来实现二维码的扫描生成。 要实现二维码的扫描功能,我们可以使用IntentIntegrator类。在需要扫描二维码的地方,调用IntentIntegrator的initiateScan方法即可启动扫描界面。扫描结果可以通过onActivityResult方法来获取。可以参考下面的代码片段: ``` IntentIntegrator integrator = new IntentIntegrator(this); integrator.setCaptureActivity(CustomCaptureActivity.class); //自定义扫描界面 integrator.setOrientationLocked(false); integrator.initiateScan(); @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (result != null) { if (result.getContents() == null) { //扫描取消 } else { String content = result.getContents(); //获取扫描结果 } } } ``` 要实现二维码的生成功能,我们可以使用MultiFormatWriter类和BitMatrix类。我们可以通过调用MultiFormatWriter的encode方法来生成BitMatrix,然后将BitMatrix转换成Bitmap。可以参考下面的代码片段: ``` MultiFormatWriter writer = new MultiFormatWriter(); try { BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height); int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { pixels[offset + x] = bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE; } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); imageView.setImageBitmap(bitmap); //在ImageView显示生成的二维码 } catch (WriterException e) { e.printStackTrace(); } ``` 通过以上步骤,我们就可以在Android Studio实现二维码的扫描生成功能了。注意,在使用zxing的时候,我们需要添加相关的权限,如相机权限等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

认真的小尹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值