Android 二维码扫码功能实现(Zxing集成,避坑启示)

这两天想要实现一个能扫码的app,找了一下,发现zxing用的比较多,就在网上找了找怎么用zxing。我主要是按照宇宝守护神的博文“Android 二维码的扫码功能实现(一)”的步骤完成的,博文链接在此:https://blog.csdn.net/qq_34902522/article/details/78384661

但是这个博文的时间比较早,2017年的,所以在按照他的步骤实现过程中,我遇到了非常非常多原作者没有遇见的坑,在这里我完整的把我的过程记录下来(真的是血泪史啊@~@)

zxing开源项目的地址:https://github.com/zxing/zxing/releases,把zxing项目下载下来。

1. 在Android Studio中新建一个空白项目。

2. 在新建项目中,file→new→import Module,将下载好的zxing项目作为module导入进来,注意,选择android这个文件夹。然后next→finish。这里面可以按照自己的需要给module取名,默认的“android”也是可以的。

3. 我们可以看到导进来之后,project中出现了一个名为“android”的文件夹

同时也出现了我们遇到的第一个bug,提示“The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.” 根据提示,打开android(新导入的module名)→src→main→AndroidMainfest.xml,里面定义了一句

<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="22"/>

把它删掉就好了。重新Sync整个项目就没有问题了。

4. 导入的步骤还没有做完,打开新导入库(我这里是android)的build.gradle,① 把"apply plugin: ‘com.android.application’语句改成"apply plugin: ‘com.android.library",② 删掉"applicationId “com.google.zxing.client.android”";③ 添加

dependencies{implementation 'com.google.zxing:android-core:3.3.0'implementation 'com.google.zxing:core:3.3.3'implementation 'com.google.zxing:android-integration:3.3.0'
}

上面添加的代码段中,解决了第一个坑,core版本要选3.3.3的,因为在3.3.0版本中,会缺少一些我们扫码过程中必须要用的函数比如说getStartTimestamp()、getEndTimestamp()等,宇宝守护神也遇到了这个问题,但是他通过暴力地把函数改了来解决这个问题,可惜我不只有这个问题,还有暴力不能解决的。寻找问题的方法:下面这个链接里面有各个版本的jar包,下载下来,通过jd-gui将jar包反编译就可以发现其中的差别,通过查找自己缺失的函数来确定使用哪个版本的jar包。

https://repo1.maven.org/maven2/com/google/zxing/

5. 继续引库。右键项目,Open Module Settings→打开窗口中左边选择application module(app),右边选dependencies→点绿色加号→Module dependency→:android→OK,OK.

6.Sync后,又一个意外之喜来了,提示错误“java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs”。接下来我们要看看是什么情况。点击左下角Terminal,输入

gradlew compileDebugSource --stacktrace -info

Terminal里面输出了很多乱七八糟的东西,往上翻翻,看到了error了。部分如下:

打开看之后,发现是所有switch-case出错了,查找资料发现,改成if-else格式就可以了。接下来就是改了,按照提示,找到对应的文件下面,把所有报错的地方的switch-case改成if-else。

7.再Sync,当当当当!有一个bug来啦,如下

提示说Manifest文件出问题了,那就去看看Androidmanifest.xml,打开这个文件后,点击下图左下角Merged Manifest,就可以在下图右边的框框里面看到error信息了。

根据提示,删除android:AndroidManifest.xml中的

android:icon="@drawable/launcher_icon"

然后按照错误提示修改一下代码里面sdk的版本,或者直接点一下提示里面给的建议,好像会直接帮修改好,轻松快乐。

8. 再Sync,终于没有错了。下面可以跑教程博客里面给出的代码了,代码在上述链接里面有给,这里就不再粘了。还有几个bug需要我们去修改。

第一个问题:提示没有下面两个类。我的解决非常暴力,直接在下载的zxing文件里面搜索,找到IntentIntegrator.java和IntentResult.java,把它们复制到MainActivity文件夹下面,这样就不需要import了,直接把这两句话删了。

复制过来之后,project中就变成了下图这样

但是需要注意的是,我们要打开把IntentIntegrator.java和IntentResult.java开头的那个packet名给改了,MainActivity里面是啥样,这俩就改成啥样。

还有一个小地方,直接复制过来的话会有如下这个错误

我们需要在layout文件夹下面的activity_main.xml中添加button的布局控件,下面这段代码作为一个小样例放在这里。

    <Buttonandroid:id="@+id/scanner"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="扫码"/>

到这一步,我们基本上解决了所有bug,下面就可以轻松愉快地真机调试,开始我们的第一步啦。

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

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

相关文章

23种设计模式之桥梁模式

桥梁模式的定义 定义: 将抽象和实现解耦, 使得两者可以独立的变化 通俗的说, 就是一个类调用另一个类中的方法, 需要一个桥梁, 通过聚合的关系调用 其类图如下: 其中角色说明如下: Abstraction 抽象化角色: 它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引…

23种设计模式之享元模式

享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态…

射频(RF)基本理论:定义、特性、调制、扩频

参考&#xff1a; INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制&#xff1f;它们的区别详解 无线网络技术教程&#xff08;第二版&#xff09; 金光、江先亮编 数字调制系列&#xff1a;IQ调制基本理论 1. 什么是射频&#xff1f; …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考&#xff1a;Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤&#xff1a; 1. 将信号调制到正弦波上。 WiFi采用QAM&#xff08;正交振幅调制&#xff09;&#xff0c;用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…

蓝牙调制

参考&#xff1a;Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 《从创意到原型&#xff1a;物联网应用快速开发》 董玮&#xff0c;高艺编著 详解蓝牙标准中的GFSK调制&#xff1a;https://blog.csdn.net/lovehua365/article/detai…

设计模式之空对象模式

空对象模式 空对象模式是通过实现一个默认的无意义对象来避免null值出现, 简单地说,就是为了避免在程序中出现null值判断而诞生的一种常用设计方法. 举个简单的例子, 一个听动物叫声的模拟程序: 动物代码: 听叫声的人: 现在我们想, 能不能把 animal 的空值判断去掉呢?我们增…

UML类图基础说明

UML类图主要由类和关系组成. 类: 什么具有相同特征的对象的抽象, 具体我也记不住, 反正有官方定义 关系: 指各个类之间的关系 类图 类就使用一个方框来表示, 把方框分成几层, 来表示不同的信息,如下图所示: 当然, 类图也不一定每一次都长这样, 比如你只分析各个类之间的关系…

J-flash 烧写cc2538教程

1. 打开J-falsh&#xff0c;所示如下界面 2. 配置相关参数。 菜单栏 Options → Project settings。按照如下框图选择。 3. 打开要烧写的文件。File → Open data file&#xff0c;选择要烧写的文件&#xff08;一般为hex或bin文件&#xff09; 4. 连接板子。Target → Connec…

跳表

概述 线性表中的链表是我们都很熟悉的结构了, 链表的增删优于数组, 但是不支持随机访问, 链表在查找时, 只能从头节点向后遍历, 那么针对链表, 能不能解决其访问效率的问题呢? 跳表来了, 顾名思义, 跳表就是可以跳跃的表, 我简单画了张图: 在原来链表的基础上, 建立一个新的…

论文写作——用excel和ppt做好看的论文图

论文写作——用excel和ppt做好看的论文图Excel 作图PPT保存前言&#xff1a;用matlab或者python作图&#xff0c;门槛较高&#xff0c;熟悉比较难。用excel和ppt就比较容易上手了。最近的论文全用ppt和excel作图&#xff0c;看着也不赖&#xff0c;在此记录一下一般的方法。 co…

Arduino Uno + Lora shield rf95_server 提示错误“Init failed!”

错误描述 在使用原始的Arduino提供的示例rf95_server和rf95_client的时候&#xff0c;烧了rf96_server的板子会出现“init failed&#xff01;”的错误&#xff0c;如下。 问题解决 经过排查&#xff0c;初始化失败由Led相干代码引起&#xff0c;因此将它们注释掉就好了&…

眼见为实

我们从小就一直再说 耳听为虚眼见为实, 但是眼见的就一定是真实的么? 我们都知道眼睛的构造, 首先是一个凸透镜, 而凸透镜接收到的图像是倒立的, 那么为什么我们看到的图像是正立的呢?当然是大脑负责将倒立的图像反转过来. 其次, 我们是左右两只眼睛, 而两只眼睛接收到的图…

用树莓派+lora shield搭建一个LoRaWAN网关

文章目录1. 创建单信道LoRaWAN网关1.1 准备工作配置树莓派上网开启树莓派SPI接口安装必需库文件1.2 正式开始把LoRa shield连接到树莓派上下载单信道LoRa网关代码到树莓派2. TTN网站相关操作2.1 注册并登录TTN2.2 注册Gateway2.3 注册Application2.4 注册device3. Client端操作…

基于linux的MsQUIC编译及样例运行

参考链接&#xff1a; https://github.com/microsoft/msquic/blob/main/docs/BUILD.md 软件相关版本 Ubuntu 20.04 编译/构建 1. 下载源代码 $ git clone --recursive https://github.com/microsoft/msquic.git 2. Powershell安装&#xff1a; 安装链接&#xff08;根据…

转载:tcpdump抓包和Wireshark解包

转自&#xff1a;https://www.cnblogs.com/domestique/p/8028405.html 简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头…

散列表(哈希表)

概述 什么是散列表? 如果说起它的另一个名字, 你一定很熟悉, 它的英文叫"Hash Table", 哈希表, 很熟悉吧. 散列的思想, 其实就是利用数组的随机访问特性, 将key-value形式的数据, 其中的key转换成数组下标, 即可实现将其存放到数组中, 进而实现随机访问. 而其中将…