Android扫码ZXing

1. 获取权限

请注意动态申请及重写申请结果返回方法。

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

2. 添加依赖

//Gradle Scripts -> build.gradle(Module:app)
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.2.0'

3. 引入

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

4. 简易扫码

(1) 启动扫码

通常,扫码是由一个按钮触发,跳转至扫码Activity(CaptureActivity)。

setDesiredBarcodeFormats()方法用于设置扫码的类型(不同类型间逗号分隔):

  1. Code 39 条形码

    • 数据容量:通常用于较短的文本字符串,支持数字、大写字母和一些特殊字符。
    • 字符集:包含数字 0-9、大写字母 A-Z 和一些特殊字符(如空格、破折号等)。
    • 用途:广泛用于工业、物流、标签等领域,用于标识物品或包装。
  2. Code 93 条形码

    • 数据容量:比 Code 39 更高,可以编码更多字符。
    • 字符集:支持所有的 ASCII 字符。
    • 用途:常用于标签、物流追踪、文档标识等领域,提供了更高的数据密度和安全性。
  3. Code 128 条形码

    • 数据容量:是一种高密度条形码,具有更高的数据编码能力。
    • 字符集:支持所有的 128 个 ASCII 字符,包括数字、字母、符号等。
    • 用途:广泛应用于零售、物流、运输等领域,用于编码大量字符和数据。
  4. UPC-A 条形码

    • 数据容量:用于编码商品标识符,可以编码 12 个数字。
    • 字符集:仅限数字。
    • 用途:主要用于零售业,标识商品,常见于北美地区。
  5. UPC-E 条形码

    • 数据容量:压缩版本的 UPC-A,可以编码 6 个数字。
    • 字符集:仅限数字。
    • 用途:通常用于小型商品包装,空间有限的情况下采用。
  6. EAN-8 条形码

    • 数据容量:编码 8 个数字。
    • 字符集:仅限数字。
    • 用途:类似 UPC-E,用于小型商品包装,空间有限的情况下采用。
  7. EAN-13 条形码

    • 数据容量:编码 13 个数字。
    • 字符集:仅限数字。
    • 用途:在全球范围内用于标识商品,常见于欧洲和其他地区
  8. QR码(Quick Response Code): 如前所述,这是一种由Denso Wave开发的二维码,最初设计用于跟踪汽车零部件。它被广泛应用于各种领域,尤其是移动支付和信息快速传递。

  9. Data Matrix: 这是另一种常见的二维码类型,它是由美国公司International Data Matrix(ID Matrix)于1989年创建的。Data Matrix常用于工业标识和物流管理。

  10. PDF417: 这是一种二维码,其名称源自它的编码规范,即PDF(Portable Data File)417。它常用于存储大量数据,如驾驶执照、护照和车辆注册证明等。

  11. Aztec Code: 这是一种用于存储数据的二维码,通常被用于票务和航空领域。

  12. MaxiCode: 这是由美国邮政服务用于自动识别包裹的一种二维码。

在中国常用的条码格式为:EAN-13 和 UPC-A 。 

button.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {IntentIntegrator intentIntegrator=new IntentIntegrator(MainActivity.this);//设置所需扫描的条码格式----可有多种,且可同时有条码和二维码intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.CODE_39,IntentIntegrator.CODE_93,IntentIntegrator.CODE_128,IntentIntegrator.UPC_A,IntentIntegrator.UPC_E,IntentIntegrator.EAN_8,IntentIntegrator.EAN_13);intentIntegrator.setBeepEnabled(true);//扫描成功是否有提示音intentIntegrator.setPrompt("扫描");//提示字符串intentIntegrator.setCameraId(0);//设置摄像头,0为背摄,1为正摄intentIntegrator.setOrientationLocked(false);//是否方向锁定intentIntegrator.setBarcodeImageEnabled(true);//是否保存扫描成功的图片intentIntegrator.initiateScan();//启动扫描器}
});

(2) 获取扫描结果

扫码界面本身也是Activity,所以想要获取扫码结果可重写onActivityResult()方法

//本码中TextView用于显示扫码结果
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {IntentResult intentResult=IntentIntegrator.parseActivityResult(requestCode, resultCode, data);//判断是否为扫码返回的if(intentResult!=null){//判断是否扫描成功if(intentResult.getContents()!=null){textView.setText(intentResult.getContents());}else {textView.setText("扫描无结果");}}super.onActivityResult(requestCode, resultCode, data);
}

5. 自定义扫码界面

扫码页面是由initiateScan()方法启动,不断查看源码可知,该方法本质是启动了一个名为CaptureActivity的页面

我们可以创建一个新的Activity并用setCaptureActivity()方法取代CaptureActivity。

为了使自定义的Activity具有CaptureActivity的能力,我们首先在Activity中设置一个com.journeyapps.barcodescanner.DecoratedBarcodeView控件,然后将CaptureActivity的Java代码复制到Activity的Java文件中并修改部分id即可。还可以在Activity添加更多的控件以满足我们的自定义需求。

(1) 自定义Activity的XML文件

app:zxing_preview_scaling_strategy="centerCrop"这个属性指定了预览图像的缩放策略。在这里,设置为 centerCrop,表示预览图像将按比例缩放并截取中间部分以适应。

app:zxing_use_texture_view="false"这个属性指定是否使用 TextureView 来显示相机预览。在这里,设置为 false,表示不使用 TextureView。不使用时为四周透明。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"tools:context=".MyCaptureActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><com.journeyapps.barcodescanner.DecoratedBarcodeViewandroid:id="@+id/decoratedBarcodeView"android:layout_height="150dp"android:layout_width="150dp"android:layout_centerInParent="true"app:zxing_preview_scaling_strategy="centerCrop"app:zxing_use_texture_view="false" /></RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

(2) 自定义Activity的Java文件

将CaptureActivity的Java代码复制并修改部分。

public class MyCaptureActivity extends AppCompatActivity {private CaptureManager capture;private DecoratedBarcodeView barcodeScannerView;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);barcodeScannerView = initializeContent();capture = new CaptureManager(this, barcodeScannerView);capture.initializeFromIntent(getIntent(), savedInstanceState);capture.decode();}/*** Override to use a different layout.** @return the DecoratedBarcodeView*/protected DecoratedBarcodeView initializeContent() {//此处修改//修改前setContentView(R.layout.zxing_capture);//修改前return (DecoratedBarcodeView)findViewById(R.id.zxing_barcode_scanner);setContentView(R.layout.activity_my_capture);return (DecoratedBarcodeView)findViewById(R.id.decoratedBarcodeView);}@Overrideprotected void onResume() {super.onResume();capture.onResume();}@Overrideprotected void onPause() {super.onPause();capture.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();capture.onDestroy();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);capture.onSaveInstanceState(outState);}@SuppressLint("MissingSuperCall")@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {capture.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);}
}

(3) 使用setCaptureActivity()方法取代CaptureActivity

button.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {IntentIntegrator intentIntegrator=new IntentIntegrator(MainActivity.this);//设置所需扫描的条码格式----可有多种,且可同时有条码和二维码intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.EAN_13,IntentIntegrator.UPC_A);intentIntegrator.setBeepEnabled(true);//扫描成功是否有提示音intentIntegrator.setPrompt("扫描");//提示字符串intentIntegrator.setCameraId(0);//设置摄像头,0为背摄,1为正摄intentIntegrator.setOrientationLocked(false);//是否方向锁定intentIntegrator.setBarcodeImageEnabled(true);//是否保存扫描成功的图片//使用自定义的Activity                intentIntegrator.setCaptureActivity(MyCaptureActivity.class);intentIntegrator.initiateScan();//启动扫描器}
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决mv3版本浏览器插件,不能注入js脚本问题

文章目录 背景引入ifream解决ifream和父页面完全跨域问题参考链接 背景 浏览器插件升级mv3版本后&#xff0c;不能再使用content_script内容脚本向原浏览器&#xff08;top&#xff09;注入script标签达到注入脚本的目的。浏览器认为插入未经审核的脚本是不安全的行为。 引入…

python给视频增加字幕

python给视频增加字幕 安装所需库 在开始之前&#xff0c;我们需要安装一些Python库。主要使用到的库如下&#xff1a; moviepy&#xff1a;用于处理视频和音频的库。 pydub&#xff1a;用于处理音频的库。 speech_recognition&#xff1a;用于语音识别的库。 首先&#xff0…

ajax请求方式处理

1、前置准备 1.1、SpringBoot项目下&#xff1a;写一个controller RestController public class TestController {RequestMapping("/yyy")public void test(HttpServletRequest request, HttpServletResponse response){String yang request.getParameter("y…

AI助力钢铁产业数字化,python基于YOLOv5开发构建钢铁产业产品智能自动化检测识别系统

AI为工业产业智能化数字化赋能早已不是什么新鲜事&#xff0c;越来越多的行业和领域开始更大范围去拥抱AI&#xff0c;享受科技带来的变革力量&#xff0c;在我们之前的文章中也有很多相关领域项目的实践经历&#xff0c;本文的核心目标就是想要基于钢铁领域产品数据来开发构建…

Vue框架的element组件table文字居中

1、代码展示 <el-table:data"table.data.slice((table.currentPage - 1) * table.limit, table.currentPage * table.limit)"style"width: 100%; margin-top: 15px"border:header-cell-style"{ textAlign: center }":cell-style"{textAl…

【KMP算法】学习总结

说明&#xff1a; 文章内容为对KMP算法的总结&#xff0c;以及力扣例题&#xff1b;文章内容为个人的学习总结&#xff0c;如有错误&#xff0c;欢迎指正。 文章目录 1. KMP算法1.1 算法步骤1.2 关于指针回退问题 2 . LeetCode例题 1. KMP算法 1.1 算法步骤 KMP算法通常用于…

springboot_vue知识点

代码放到了仓库。 springboot_vue知识点 1.搭建1.vue2.springboot 2.前后端请求和响应的封装1.请求封装2.响应封装 3.增删改查1.查询2.分页3.新增和编辑4.删除 4.跨域和自定义异常5.JWT鉴权1.配置pom2.拦截前端请求的拦截器3.生成token并验证token4.登录后生成token5.前端获取…

git如何查看配置,修改配置,设置配置

# 显示当前的Git配置 $ git config --list# 编辑Git配置文件 $ git config -e [--global]# 设置提交代码时的用户信息 $ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]"

Grafana如何实现折线柱状图

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

竞赛选题 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

从六个方面对比Go和Python的差异

您是否想过 Go 与 Python 之间的主要区别是什么&#xff1f;随着对软件开发人员的需求不断增加&#xff0c;选择哪种编码语言可能会很困难。 ​ 在此&#xff0c;我们将从六个方面对比Go和Python,探讨 Go 和 Python之间的差异。我们将讨论它们的特点、优缺点&#xff0c;以便…

GPT、GPT-2、GPT-3论文精读笔记

视频&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili MAE论文&#xff1a;把bert用回计算机视觉领域 CLIP论文&#xff1a;打通文本和图像 GPT 论文&#xff1a;Improving Language Understanding by Generative Pre-Training …

史诗级云故障敲响警钟,应用保障不能没有“连续键”!

近日&#xff0c;知名云服务商出现一次史诗级的云故障&#xff1a;全球所有区域/所有服务同时异常&#xff0c;故障持续长达3小时之多&#xff0c;云上众多应用受到极大影响。 如今&#xff0c;在一个充满不确定性和复杂性的数字化时代&#xff0c;哪怕是顶级云服务商亦不能避…

python-append与extend的区别

append 和 extend 是用于向列表&#xff08;List&#xff09;添加元素的两种不同的方法&#xff0c;它们在功能上有一些重要的区别。 append 方法&#xff1a; append 方法用于在列表的末尾添加单个元素。语法&#xff1a;list.append(element)示例&#xff1a;my_list [1, 2,…

并行与分布式计算 第9章 算法设计

文章目录 并行与分布式计算 第9章 算法设计9.1 设计过程9.1.1 PCAM设计过程9.1.2 划分9.1.3 通信9.1.4 组合9.1.5 映射 8.2 设计方法8.2.1 划分技术9.2.2 分治9.2.3 平衡树技术9.2.4倍增技术9.2.5 流水线技术9.2.6 破对称技术 并行与分布式计算 第9章 算法设计 9.1 设计过程 …

一张图,了解美格智能高算力AI模组

美格智能高算力A模组&#xff0c;澎湃算力让AI触手可及&#xff01;

数字化背景下,集流体行业的智能制造方法论

行业背景 随着全球对清洁能源需求的不断增加&#xff0c;新能源领域正在迅速崛起&#xff0c;在新能源技术中&#xff0c;锂电池作为一种高效、轻便的能量储存解决方案&#xff0c;正成为主流。而锂电集流体作为锂电池的核心部件&#xff0c;承担着电池内部电流分布的关键角色…

掌握Java关键字与面试技巧的完美结合!

问题&#xff1a;请说明什么是策略模式&#xff0c;并使用Java代码举例说明其使用场景和实现方式。 答案&#xff1a; 策略模式是一种行为型设计模式&#xff0c;它允许在运行时根据不同的情况选择不同的算法或策略。它将每个可选的算法封装成一个独立的类&#xff0c;从而使得…

服务号可以迁移到订阅号吗

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要看一下服务号和订阅号的主要区别。1、服务号推送的消息没有折叠&#xff0c;消息出现在聊天列表中&#xff0c;会像收到消息一样有提醒。而订阅号推送的消息是折叠的&#xff0c;“订阅号…