Android二维码扫描之SimpleZXing中文乱码问题的解决_Lux的蓝朋友的博客-程序员宅基地

技术标签: Bug解决  Android开源  技术交流  

最近公司的项目中需要Android端做一个扫描二维码的应用,网上推荐的帖子中在github上找到一个叫做SimpleZXing的开源项目,本来呢谷歌是有提供官方的demo的,也是开源的,那个项目叫ZXing。我找的这个SimpleZXing是基于ZXing的基础上,去掉了不必要的部分,只保留了扫描二维码识别的功能,有需要的朋友可以去找一下:点击打开链接下载完后导入AndroidStudio就可以了,我的是直接就可以运行了,也没报错,如果各位导入项目的时候有报错,看一下你们的AS版本和相关的配置。导入后安装到手机上使用,发现正常二维码的是可以扫出来的,但是当二维码中有文字的时候,识别出来是乱码的,当时也蒙了,然后就一步一步分析识别的流程,我觉得肯定是解码的时候出问题了,但是看了一天的代码也没找问题出在哪了。然后在网上找解决方法,试了很多但是都不行,自己就又开始研究,终于第二天晚上的时候在结合网上的解决方法和自己的改造后解决了这个问题!

这个问题的解决主要有以下几个步骤:

1.在CaptureActivity中的onResume方法中添加如下:

decodeFormats = null;
characterSet = "ISO-8859-1";
这个2个变量是在 CaptureActivity中定义的:

private String characterSet;
private Collection<BarcodeFormat>
decodeFormats;
2.找到CaputreActivity中的initCemare方法,将该方法下的new  CaputreActivityHandler()里面的参数改为:

new CaptureActivityHandler(this,decodeFormats, decodeHints, characterSet,  cameraManager)
3.去 CaputreActivityHandler类里面的构造方法改为相应的:

CaptureActivityHandler(CaptureActivity activity,
                           Collection<BarcodeFormat> decodeFormats,
                           Map<DecodeHintType,?> baseHints,
                           String characterSet,
                           CameraManager cameraManager)
4.紧接着将上述构造方法下面的new DecodeThread方法的参数改为:

new DecodeThread(activity, decodeFormats, baseHints, characterSet,new ViewfinderResultPointCallback(activity.getViewfinderView()));
5.将new DecodeThread类中的构造方法参数改为:

public DecodeThread(CaptureActivity activity,
                        Collection<BarcodeFormat> decodeFormats,
                        Map<DecodeHintType,?> baseHints,
                        String characterSet,
                        ResultPointCallback resultPointCallback)
6.在hints = new EnumMap<>(DecodeHintType.class)的下面加多一段:

if (baseHints != null) {
            hints.putAll(baseHints);
        }
7.在
hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
        hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback);
后面加多一段:

if (characterSet != null) {
            hints.put(DecodeHintType.CHARACTER_SET, characterSet);
        }
8.回到你接收最终结果的Activity,有的人是ResultActivity,我的是ManActivity里面,在接收到数据的后面加,如:
String resultData = data.getStringExtra(CaptureActivity.EXTRA_SCAN_RESULT);
加多一段如下:
String UTF_Str = "";
                        String GB_Str = "";
                        boolean is_cN = false;
                        try {
                            UTF_Str = new String(resultData.getBytes("ISO-8859-1"), "UTF-8");
                            is_cN = IsChineseOrNot.isChineseCharacter(UTF_Str);
                            //防止有人特意使用乱码来生成二维码来判断的情况
                            boolean b = IsChineseOrNot.isSpecialCharacter(resultData);
                            if (b) {
                                is_cN = true;
                            }
//                            System.out.println("是为:"+is_cN);
                            if (!is_cN) {
                                GB_Str = new String(resultData.getBytes("ISO-8859-1"), "GB2312");
//                                System.out.println("这是转了GB2312的"+GB_Str);
                            }
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }

                        if(is_cN){
                            tvResult.setText(UTF_Str);
                        }else{
                            tvResult.setText(GB_Str);
                        }
这段代码就加到resultData那行后面就好了

9.ok,运行一把,乱码问题解决了,给我高兴的呀!这个问题虽然不算难,但是第一次遇到,也耗了我2天的时间才解决,如果是有下载github上的SimpleZXing(github排第一个的)的同学(其他的没试过),在遇到中文识别乱码的时候,可以参照我上面给出的流程去试一下,已经写的很详细啦!如果还有什么不懂的地方或者改进的建议,都可以相互 交流学习哦!








版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40869894/article/details/78986885

智能推荐

适配器模式(三种)简单使用_Must_Do_Kaihong的博客-程序员宅基地_将一个类的接口转换成客户希望的另一个接口

前言适配器模式是将一个类的接口转换成客户希望的另外一个接口,身边很多东西都是适用于适配器模式的,笔记本的电源(也叫电源适配器),是将220V的交流电转换为笔记本电脑所需要的12V(电流先忽略),笔记本电脑的各种接口,VGA转Hdml,USB-TypeA 转 USB-TypeC,亦或者你在香港买了个手机,充电器是你生活中没见过的三孔插座通过一个转换头转换为国内常用的插头,很多例子都能很形象的解释

Error和Exception、RuntimeException和非RuntimeException的区别_栖风宿雨的博客-程序员宅基地

1 异常机制异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。 传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确

ArcGIS Engine开发中利用GP工具时常出现的错误_花海_的博客-程序员宅基地

在用GP工具的时候常常会碰到这个错误:调用 GP 对 COM 组件的调用返回了错误 HRESULT E_FAIL解决方案:这种情况一般有两种可能。1.AE程序的license的级别不够。2.GP工具的参数设置出错。

02.JDK的安装配置和简单程序HelloWord!_果树林的博客-程序员宅基地_jdk hello word

.JDK的安装配置    .按照要求将JDK1.5,下载并按要求执行安装。    . 用鼠标右键单击【我的电脑】,弹出菜单,选择【属性】,弹出【系统特性】对话框,再单击对话框中的      【高级】,然后单击【环境变量】按钮,添加如下的系统环境变量:        path:系统执行命令时需要搜索的路径,        classpath:运行、编译时要搜索的路径

TestFlight被收购了,那我们怎么使用呢?_爱生活爱编程666的博客-程序员宅基地_testflight 被收购

相信一部分开发者,对于Apple收购TestFlight有着比较好奇的心态,那么TestFlight在被收购后,已经再次重新正式发布,可以正常使用了,那么又有多少开发者会去使用它呢?读完Apple的TestFlight官方文档之后,已经不能阻止我的小宇宙爆发了,开始折腾了起来,大致总结有以下两点:如果可以接受10测试人员,那么就不需要提交审核,意味着不需要Apple的漫

随便推点

理解物体检测中的Objectness_ronghuaiyang的博客-程序员宅基地

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”作者:Nathan Zhao编译:ronghuaiyang导读在本文中,我们将讨论目标检测模型和Objectness的基础知识。...

DDos学习——CC攻击(一)_AJR_LY的博客-程序员宅基地

本文主要记录DDoS攻击中的CC攻击。CC攻击又可以分为代理CC攻击和肉鸡CC攻击。(1)代理CC攻击是黑客借助代理服务器生成指向受害主机的合法网页请求,实现DDoS和伪装    (2)肉鸡CC攻击是黑客使用CC攻击软件,控制大量肉鸡,发动攻击,相比来后者比前者更难防御。因为肉鸡可以模拟正常用户访问网站的请求。伪造成合法数据包。    CC(challenge Collapsar,挑战黑洞),其前...

linux 下iptables 执行清除命令 iptables -F 要非常小心_魏浩东的博客-程序员宅基地

linux 下iptables 执行清除命令 iptables -F 要非常小心          在linux系统已经配置好iptables的情况下,一定要非常小心的使用iptables -F,如果默认策略已经配置为deny的话,再使用iptables -F,会导致网络立马中断!(亲身经历啊!......)           如果想清空的话,先执行iptable

跟着艾文一起学前端-第18篇-JavaScript-原型与继承_Thomas.Ma的博客-程序员宅基地

1、背景函数的相关知识构造函数和实例对象的关系实例对象由构造函数创建,使用构造函数创建实例对象的过程叫做对象的实例化。查看某个对象的结构,可以通过console.dir(对象);通过查看对象的结构,可以看到每个对象都有一个特殊的属性叫作原型(prototype)判断一个对象的类型的方式:instanceof - - datObj instanceof CustomObject...

java.net.BindException: Address already in use: bind_不要停止思考-jcn的博客-程序员宅基地

在启动springboot项目的时候,出现了这个错误:端口被其他进程占用。解决方法:关闭后台Tomcat或者Oracle服务进程。如果不行,则关闭console的其他后台进程。java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) ~[na:1.7.0_8...

几款常用的Git 图形化工具_LiQian999的博客-程序员宅基地_git 可视化工具

工欲善其事,必先利其器。作为一名开发人员,你不可能不知道git,无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发,git都已经是源代码管理工具的首选。当然,那些hardcore developer会说,command line才是最好的工具,但并不是所有的时候command line都是高效的(不服?在command line里面做个compare试试你就知道了)。小编日常用的最多...

推荐文章

热门文章

相关标签