当前位置: 首页 > news >正文

使用ZXing开发安卓扫码功能

在安卓开发中实现扫描二维码功能,通常可以借助第三方库,如 ZXing 或 ZBar 来简化开发流程。下面以 ZXing 库为例,详细介绍如何实现扫描二维码的功能:

1. 添加依赖

在项目的 build.gradle 文件里添加 ZXing 库的依赖:

dependencies {implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
}

2. 申请相机权限

AndroidManifest.xml 文件中添加相机权限申请:

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

并且在代码里动态请求相机权限:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;public class MainActivity extends AppCompatActivity {private static final int CAMERA_PERMISSION_REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);} else {// 权限已授予,启动扫描startScanning();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限已授予,启动扫描startScanning();} else {// 权限被拒绝,给出提示}}}private void startScanning() {// 启动扫描的代码}
}

3. 启动扫描界面

在需要启动扫描的地方添加如下代码:

import com.journeyapps.barcodescanner.CaptureActivity;
import com.journeyapps.barcodescanner.ScanContract;
import com.journeyapps.barcodescanner.ScanIntentResult;
import com.journeyapps.barcodescanner.ScanOptions;public class MainActivity extends AppCompatActivity {// ... 前面的代码 ...private final ScanContract.ScanResultCallback barcodeCallback = new ScanContract.ScanResultCallback() {@Overridepublic void onActivityResult(ScanIntentResult result) {if (result.getContents() == null) {// 用户取消了扫描} else {// 获取扫描结果String barcodeResult = result.getContents();// 处理扫描结果}}};private void startScanning() {ScanOptions options = new ScanOptions();options.setDesiredBarcodeFormats(ScanOptions.QR_CODE);options.setPrompt("将二维码置于扫描框内");options.setCameraId(0); // 后置摄像头options.setBeepEnabled(true);options.setBarcodeImageEnabled(true);barcodeLauncher.launch(options);}private final androidx.activity.result.ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(new ScanContract(),barcodeCallback);
}

4. 处理扫描结果

barcodeCallbackonActivityResult 方法中,对扫描结果进行处理。若扫描结果不为空,就可以获取到扫描到的二维码内容:

private final ScanContract.ScanResultCallback barcodeCallback = new ScanContract.ScanResultCallback() {@Overridepublic void onActivityResult(ScanIntentResult result) {if (result.getContents() == null) {// 用户取消了扫描} else {// 获取扫描结果String barcodeResult = result.getContents();// 处理扫描结果,例如显示在 TextView 中TextView resultTextView = findViewById(R.id.resultTextView);resultTextView.setText(barcodeResult);}}
};

完整代码示例

下面是一个完整的 MainActivity 代码示例:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.journeyapps.barcodescanner.CaptureActivity;
import com.journeyapps.barcodescanner.ScanContract;
import com.journeyapps.barcodescanner.ScanIntentResult;
import com.journeyapps.barcodescanner.ScanOptions;public class MainActivity extends AppCompatActivity {private static final int CAMERA_PERMISSION_REQUEST_CODE = 1;private TextView resultTextView;private final ScanContract.ScanResultCallback barcodeCallback = new ScanContract.ScanResultCallback() {@Overridepublic void onActivityResult(ScanIntentResult result) {if (result.getContents() == null) {// 用户取消了扫描} else {// 获取扫描结果String barcodeResult = result.getContents();// 处理扫描结果,例如显示在 TextView 中resultTextView.setText(barcodeResult);}}};private final androidx.activity.result.ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(new ScanContract(),barcodeCallback);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);resultTextView = findViewById(R.id.resultTextView);if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);} else {// 权限已授予,启动扫描startScanning();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限已授予,启动扫描startScanning();} else {// 权限被拒绝,给出提示}}}private void startScanning() {ScanOptions options = new ScanOptions();options.setDesiredBarcodeFormats(ScanOptions.QR_CODE);options.setPrompt("将二维码置于扫描框内");options.setCameraId(0); // 后置摄像头options.setBeepEnabled(true);options.setBarcodeImageEnabled(true);barcodeLauncher.launch(options);}
}    

布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/resultTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:paddingTop="16dp" />
</LinearLayout>

总结

通过上述步骤,你可以在安卓应用中实现扫描二维码的功能。主要步骤包括添加依赖、申请相机权限、启动扫描界面以及处理扫描结果。

http://www.xdnf.cn/news/180919.html

相关文章:

  • 【C++】C++11新特性(一)
  • 【前端】element表格X轴滚动优化拖拽滚动
  • 函数式编程之 Optional
  • 海底世界-第16届蓝桥第4次STEMA测评Scratch真题第5题
  • 【jax】ms(毫秒)和 μs(微秒)
  • Leetcode395.至少有 K 个重复字符的最长子串
  • Qt从零开始(1)了解
  • Golang | 倒排索引Value的设计
  • Python爬虫实战:获取ya马逊最新销售飙升榜数据并做分析,为电商选品做参考
  • 【AI】MCP协议,AI界的USB接口
  • FastAPI系列06:FastAPI响应(Response)
  • leetcode--盛最多水的容器,接雨水
  • 数值分析、数值代数之追赶法
  • Linux课程五课---Linux进程认识1
  • MySQL----查询
  • 树莓派超全系列教程文档--(43)树莓派内核简介及更新
  • 机器学习基础——Seaborn使用
  • C++11
  • 自然语言处理之机器翻译:Statistical Machine Translation(SMT)的评估方法解析与创新实践
  • 小集合 VS 大集合:MySQL 去重计数性能优化
  • 常用第三方库:sqflite数据库应用
  • Python语言基础知识详解:数据类型及运算
  • 【MQ篇】RabbitMQ之消费失败重试!
  • 2、Linux操作系统下,ubuntu22.04版本安装搜狗输入法
  • <PLC><汇川><工控>汇川PLC实现光纤缠绕设备
  • ollama的若干实践
  • Step1X-Edit: A practical framework for general image editing
  • PaddleX的安装
  • Moment 在 JavaScript 中解析、校验、操作、显示日期和时间
  • web 开发中,前端部署更新后,该怎么通知用户刷新