Android进阶之路 - zxing二维码扫描与生成

万年之前就想写篇文章记录一下二维码功能的实现,没想到一拖就到了现在,对了今天是周六 ~~~

现在网上有很多的关于扫码的三方库,当然这些都是基于zxing这个框架去扩展的,我这这里记录俩种方式,一种满足与基本需求,另外一种满足一些扩展性的需求,使用起来比使用zxing方便一些,毕竟进行了二次封装。

俩种方式 :
1.zxing - 可满足基本需求(效果比较渣,用不了的话就放弃)
2.android-zxingLibrary - 可满足自我的一些扩展性需求

方式一 : zxing

  • Effect
    这里写图片描述

  • 预先配置

1.先在 build.gradle(Project:XXXX) 的 repositories 添加:

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

2.然后在 build.gradle(Module:app) 的 dependencies 添加:

compile 'com.github.yuzhiqiang1993:zxing:2.1.6'
  • 权限

1.常规权限加入

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.针对6.0的动态权限申请

Manifest.permission.CAMERA
Manifest.permission.READ_EXTERNAL_STORAGE
  • 扫码方式

1.ZxingConfig配置(看情况使用,如果只是满足基本功能,没必要理会)

扫描二维码关注公众号,回复: 887617 查看本文章
//ZxingConfig config = new ZxingConfig();
//config.setShowbottomLayout(true);//底部布局(包括闪光灯和相册)
//config.setPlayBeep(true);//是否播放提示音
//config.setShake(true);//是否震动
//config.setShowAlbum(true);//是否显示相册
//config.setShowFlashLight(true);//是否显示闪光灯

2.触发扫描事件

        //这里的config是原作者包装的一些属性
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //如果不传 ZxingConfig的话,两行代码就能搞定了
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
//                intent.putExtra(Constant.INTENT_ZXING_CONFIG, config);
                startActivityForResult(intent, REQUEST_CODE_SCAN);
            }
        });

2.onActivityResult回调

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 扫描二维码/条码回传
        if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
            if (data != null) {
                String content = data.getStringExtra(Constant.CODED_CONTENT);
                mContent.setText("扫描结果为:" + content);
            }
        }
    }
  • 生成二维码

触发生成事件

  //定义二维码数据
        final String data="我爱你,亲爱的姑娘";
        mCreate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TextUtils.isEmpty(data)) {
                    Toast.makeText(MainActivity.this, "data不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                Bitmap bitmap = null;
                try {
                    /**
                    * contentEtString:字符串内容
                    * w:图片的宽
                    * h:图片的高
                    * logo:不需要logo的话直接传null
                    * */
                    Bitmap logo = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
                    //logo设置为null,则二维码中心没有图片,大小可自己设置,至于显示位置,在自己的布局进行设置
                    bitmap = CodeCreator.createQRCode(data, 400, 400, null);
                    mIvCreate.setImageBitmap(bitmap);
                } catch (WriterException e) {
                    e.printStackTrace();
                }
            }
        });

完整Demo代码

  • MainActivity
package com.example.yongliu.zxing;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.zxing.WriterException;
import com.yzq.zxinglibrary.android.CaptureActivity;
import com.yzq.zxinglibrary.bean.ZxingConfig;
import com.yzq.zxinglibrary.common.Constant;
import com.yzq.zxinglibrary.encode.CodeCreator;

public class MainActivity extends AppCompatActivity {

    private int REQUEST_CODE_SCAN = 111;
    private TextView mContent;
    private TextView mCreate;
    private ImageView mIvCreate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView mBtn = findViewById(R.id.btn);
        mContent = findViewById(R.id.content);
        mCreate = findViewById(R.id.create);
        mIvCreate = findViewById(R.id.ic_create);

        final ZxingConfig config  = new ZxingConfig();
        config.setShowAlbum(false);
        config.setShowFlashLight(false);
        config.setShowbottomLayout(false);

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //如果不传 ZxingConfig的话,两行代码就能搞定了
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
//                intent.putExtra(Constant.INTENT_ZXING_CONFIG, config);
                startActivityForResult(intent, REQUEST_CODE_SCAN);
            }
        });

        //定义二维码数据
        final String data="我爱你,亲爱的姑娘";
        mCreate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TextUtils.isEmpty(data)) {
                    Toast.makeText(MainActivity.this, "data不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                Bitmap bitmap = null;
                try {
                    /**
                    * contentEtString:字符串内容
                    * w:图片的宽
                    * h:图片的高
                    * logo:不需要logo的话直接传null
                    * */
                    Bitmap logo = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
                    //logo设置为null,则二维码中心没有图片,大小可自己设置,至于显示位置,在自己的布局进行设置
                    bitmap = CodeCreator.createQRCode(data, 400, 400, null);
                    mIvCreate.setImageBitmap(bitmap);
                } catch (WriterException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 扫描二维码/条码回传
        if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
            if (data != null) {
                String content = data.getStringExtra(Constant.CODED_CONTENT);
                mContent.setText("扫描结果为:" + content);
            }
        }
    }
}
  • activity_main
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.yongliu.zxing.MainActivity">

    <TextView
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:gravity="center"
        android:text="扫描"/>

    <TextView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        />

    <TextView
        android:id="@+id/create"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:gravity="center"
        android:text="生成"/>

    <ImageView
        android:id="@+id/ic_create"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/80032047