欢迎访问宙启技术站
智能推送

Android中怎么利用zxing生成二维码

发布时间:2023-05-15 21:43:01

Android中利用zxing库生成二维码

二维码已经成为一个常见的标记工具,被广泛用于商业、交通、教育等领域。在Android中,可以使用zxing库来实现二维码的生成和解析。zxing库是一个开源的二维码扫描库,实现了二维码、一维码的扫描和生成。本文主要介绍如何在Android项目中利用zxing库生成二维码。

一、添加zxing库

1.1 下载zxing库

可以在官网下载最新版的zxing库:https://github.com/zxing/zxing

也可以在Gradle中添加依赖:

repositories {

    jcenter()

}

dependencies {

    compile 'com.journeyapps:zxing-android-embedded:3.6.0'

}

1.2 添加权限

在AndroidManifest.xml文件中添加相应的权限:

<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

二、生成二维码

2.1 创建一个activity用于生成二维码

在Android Studio中创建一个新的activity,比如我们在这里创建了GenerateQRCodeActivity。在activity的xml文件中添加一个ImageView控件用于显示二维码。在activity的java代码中,使用zxing库生成二维码,并将其显示在ImageView中。

2.2 生成二维码核心代码

使用zxing库生成二维码,需要先创建一个BitMatrix对象,通过该对象可以将二维码渲染为Bitmap对象:

private void generateQRCode() {

    String content = "这是二维码的内容";

    int width = 400, height = 400;

    try {

        //生成二维码

        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);

        int[] pixels = new int[width * height];

        //将二维码渲染成Bitmap对象

        for (int y = 0; y < height; y++) {

            for (int x = 0; x < width; x++) {

                if (bitMatrix.get(x, y)) {

                    pixels[y * width + x] = 0xff000000;

                } else {

                    pixels[y * width + x] = 0xffffffff;

                }

            }

        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

        mImageView.setImageBitmap(bitmap);

    } catch (WriterException e) {

        e.printStackTrace();

    }

}

上述代码中,我们将要生成的二维码内容设置为"这是二维码的内容",大小为400*400。MultiFormatWriter是zxing库提供的一个工具类,用于生成二维码,BarcodeFormat.QR_CODE表示生成二维码格式。渲染二维码核心代码:将二维码的像素点一一渲染出来,设置成黑色或白色像素点,最终通过 Bitmap.createBitmap 创建 Bitmap 对象,再将生成的 Bitmap 对象设置给 ImageView 控件,即可在界面上显示二维码。

完整代码:

public class GenerateQRCodeActivity extends AppCompatActivity {

    private ImageView mImageView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_generate_qrcode);

        mImageView = findViewById(R.id.iv_qr_code);

        generateQRCode();

    }

    /**

     * 生成二维码

     */

    private void generateQRCode() {

        String content = "这是二维码的内容";

        int width = 400, height = 400;

        try {

            //生成二维码

            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);

            int[] pixels = new int[width * height];

            //将二维码渲染成Bitmap对象

            for (int y = 0; y < height; y++) {

                for (int x = 0; x < width; x++) {

                    if (bitMatrix.get(x, y)) {

                        pixels[y * width + x] = 0xff000000;

                    } else {

                        pixels[y * width + x] = 0xffffffff;

                    }

                }

            }

            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

            mImageView.setImageBitmap(bitmap);

        } catch (WriterException e) {

            e.printStackTrace();

        }

    }

}

效果如下:

三、生成带logo的二维码

二维码加上logo更能吸引人眼球。同样可以使用zxing库来生成带logo的二维码。

3.1 添加logo

可以通过调用该方法获取Application中的App icon:

ApplicationInfo applicationInfo = context.getApplicationInfo();

int resId = applicationInfo.icon;

Drawable drawable = context.getResources().getDrawable(resId);

也可以在保存logo的 mipmap 文件夹中添加一个新的logo,这里我们放在 app/src/main/res/mipmap 文件夹中。

3.2 生成带logo的二维码

绘制logo

将生成的二维码放置在画布上,并将logo在二维码中心处绘制:

public Bitmap drawLogo(Bitmap qrBitmap, Bitmap logoBitmap) {

    int qrWidth = qrBitmap.getWidth();

    int qrHeight = qrBitmap.getHeight();

    int logoWidth = logoBitmap.getWidth();

    int logoHeight = logoBitmap.getHeight();

    Bitmap bitmap = Bitmap.createBitmap(qrWidth, qrHeight, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(bitmap);

    canvas.drawBitmap(qrBitmap, 0, 0, null);

    canvas.save(Canvas.ALL_SAVE_FLAG);

    //绘制logo,位置在二维码中心处

    canvas.drawBitmap(logoBitmap, (qrWidth - logoWidth) / 2, (qrHeight - logoHeight) / 2, null);

    canvas.restore();

    return bitmap;

}

绘制logo的核心代码,使用Canvas绘图功能:

//创建一个新的Bitmap对象

Bitmap bitmap = Bitmap.createBitmap(qrWidth, qrHeight, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

//将二维码放置在画布上

canvas.drawBitmap(qrBitmap, 0, 0, null);

//绘制logo,位置在二维码中心处

canvas.drawBitmap(logoBitmap, (qrWidth - logoWidth) / 2, (qrHeight - logoHeight) / 2, null);

完整代码:

public class GenerateQRCodeActivity extends AppCompatActivity {

    private static final int QR_WIDTH = 400, QR_HEIGHT = 400;

    private ImageView mImageView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_generate_qrcode);

        mImageView = findViewById(R.id.iv_qr_code);

        generateQRCode();

    }

    /**

     * 生成二维码

     */

    private void generateQRCode() {

        String content = "这是二维码的内容";

        try {

            //生成二维码

            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT);

            //将二维码渲染成Bitmap对象

            int[] pixels = new int[QR_WIDTH * QR_HEIGHT];

            for (int y = 0; y < QR_HEIGHT; y++) {

                for (int x = 0; x < QR_WIDTH; x++) {

                    if (bitMatrix.get(x, y)) {

                        pixels[y * QR_WIDTH + x] = 0xff000000;

                    } else {

                        pixels[y * QR_WIDTH + x] = 0xffffffff;

                    }

                }

            }

            Bitmap qrBitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);

            qrBitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);

            //生成带logo的二维码

            Bitmap logoBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

            Bitmap bitmap = drawLogo(qrBitmap, logoBitmap);

            mImageView.setImageBitmap(bitmap);

        } catch (WriterException e) {

            e.printStackTrace();

        }

    }

    /**

     * 绘制logo

     *

     * @param qrBitmap   二维码Bitmap

     * @param logoBitmap logo Bitmap

     * @return 返回生成的带logo的二