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;
}
}
程序功能展示
感谢各位读者的阅读!希望大家给出一键三连,多多支持原创。有错误和不解的地方,欢迎各位读者在评论区讨论,我也会不断学习不断改进,做出更加优质的作品!!!
最后相关代码已传入资源中,可根据需求自行获取。