Android实例项目【保姆级教程】通过手机识别二维码+对识别数据进行打印处理

Android环境搭建

可参考往期文章,进行环境搭建


Android代码编写

创建工程,工程名为qr_code_identification。(创建的具体操作不再具体展开)

一、添加依赖项

首先,在build.gradle (Module: app)文件中添加以下依赖:

dependencies {
    implementation 'com.google.zxing:core:3.4.1'
    implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
    implementation 'androidx.print:print:1.0.0'
}

上述依赖的作用

 com.google.zxing:core:3.4.1

用途:Zxing 的核心库,提供条形码/二维码的 生成与解析 功能。

  • 生成:将文本、URL 等数据编码为二维码或条形码图像。

  • 解析:从相机画面或本地图片中读取条形码/二维码内容。

  • 支持多种格式:QR Code、UPC-A、EAN-8、Code 128 等。
     

com.journeyapps:zxing-android-embedded:4.3.0

用途:简化 Zxing 在 Android 中的集成,提供 开箱即用的扫描界面和工具

  • 内置相机预览、权限处理和扫描界面,无需手动实现。

  • 通过 Intent 或自定义 Activity 直接调用扫码功能。

  • 支持自定义界面主题(如扫描框样式、提示文字)。
     

 androidx.print:print:1.0.0

用途:Android 官方打印框架,用于 生成打印内容(如文档、图片)。

  • 打印生成的条形码/二维码图像。

  • 支持连接物理打印机或保存为 PDF 文件。

  • 兼容 Android 4.4+ 设备。



二、样式设计

在activity_main.xml可根据自己需要的场景进行自主设计。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/scan_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="扫描二维码" />

    <TextView
        android:id="@+id/result_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="扫描结果将显示在这里"
        android:textSize="18sp" />

    <Button
        android:id="@+id/print_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="打印结果" />

</LinearLayout>

设计样例如下所示: 


三、核心配置文件

AndroidManifest.xml完整代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.qr_code_identification">

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light">
        <activity android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

上述标签的作用 

1.根标签

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.qr_code_identification">
  • 属性解析

    • xmlns:android:定义 Android 命名空间,用于访问 Android 专属属性(如 android:id)。

    • package:应用的唯一标识符,与 Gradle 的 applicationId 共同决定应用在设备中的唯一性。

2.硬件特性声明

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />
  • 作用:声明应用需要或可选的硬件特性。此处声明使用摄像头,但非必需(required="false")。

  • 影响

    • Google Play 会根据此标签过滤设备(如设为 true,无摄像头的设备无法安装)。

    • 若应用主要功能依赖摄像头,建议设为 true 以避免兼容性问题。

3.权限声明

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
  • 权限用途

    • CAMERA:访问摄像头(扫描二维码必需)。

    • INTERNET:允许网络请求(若应用仅本地生成/扫描二维码,可能无需此权限)。

4.应用配置

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.AppCompat.Light">
  • 属性解析

    • allowBackup:允许通过 Android 备份服务备份应用数据(默认 true)。

    • icon 和 roundIcon:应用图标(方形和圆形)。

    • label:应用名称(显示在桌面)。

    • supportsRtl:支持从右到左布局(如阿拉伯语)。

    • theme:全局主题(Theme.AppCompat.Light 需依赖 appcompat 库)。

5.主Acivity声明

<activity 
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  • 属性解析

    • android:name:Activity 类名(相对于 package 的路径)。

    • android:exported:是否允许其他应用启动此 Activity(主入口需设为 true)。

    • intent-filter:定义 Activity 为应用入口(MAIN 动作和 LAUNCHER 类别)。


四、主界面逻辑文件

在MainActivity.java中的代码如下:

package com.example.qr_code_identification;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.print.PrintHelper;

import android.content.Intent;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

public class MainActivity extends AppCompatActivity {

    private Button scanButton;
    private Button printButton;
    private TextView resultTextView;
    private String qrContent = "";

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

        scanButton = findViewById(R.id.scan_button);
        printButton = findViewById(R.id.print_button);
        resultTextView = findViewById(R.id.result_text);

        scanButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startQRScanner();
            }
        });

        printButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                printQRResult();
            }
        });
    }

    private void startQRScanner() {
        IntentIntegrator integrator = new IntentIntegrator(this);
        integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE);
        integrator.setPrompt("Scan a QR Code");
        integrator.setCameraId(0);  // 使用后置摄像头
        integrator.setBeepEnabled(true);
        integrator.setBarcodeImageEnabled(true);
        integrator.initiateScan();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (result != null) {
            if (result.getContents() == null) {
                Toast.makeText(this, "扫描取消", Toast.LENGTH_LONG).show();
            } else {
                qrContent = result.getContents();
                resultTextView.setText("扫描结果: " + qrContent);
                Toast.makeText(this, "扫描成功", Toast.LENGTH_LONG).show();
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    private void printQRResult() {
        if (qrContent.isEmpty()) {
            Toast.makeText(this, "请先扫描二维码", Toast.LENGTH_SHORT).show();
            return;
        }

        PrintHelper printHelper = new PrintHelper(this);
        printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT);

        // 创建要打印的文本图像
        Bitmap bitmap = createTextBitmap("二维码内容: " + qrContent);
        printHelper.printBitmap("QR Code Print", bitmap);
    }

    private Bitmap createTextBitmap(String text) {
        // 这里简化处理,实际应用中可能需要更复杂的图像生成
        // 你可以使用Canvas来绘制更复杂的打印内容
        Bitmap bitmap = Bitmap.createBitmap(800, 400, Bitmap.Config.ARGB_8888);
        android.graphics.Canvas canvas = new android.graphics.Canvas(bitmap);
        canvas.drawColor(android.graphics.Color.WHITE);
        android.graphics.Paint paint = new android.graphics.Paint();
        paint.setColor(android.graphics.Color.BLACK);
        paint.setTextSize(36);
        canvas.drawText(text, 50, 200, paint);
        return bitmap;
    }
}


程序功能展示


感谢各位读者的阅读!希望大家给出一键三连,多多支持原创。有错误和不解的地方,欢迎各位读者在评论区讨论,我也会不断学习不断改进,做出更加优质的作品!!!

最后相关代码已传入资源中,可根据需求自行获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

花开月满西楼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值