最近公司的项目中需要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
decodeFormats;
2.找到CaputreActivity中的initCemare方法,将该方法下的new
CaputreActivityHandler()里面的参数改为:
new CaptureActivityHandler(this,decodeFormats, decodeHints, characterSet, cameraManager)
3.去
CaputreActivityHandler类里面的构造方法改为相应的:
CaptureActivityHandler(CaptureActivity activity,
Collection decodeFormats,
Map 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 decodeFormats,
Map 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排第一个的)的同学(其他的没试过),在遇到中文识别乱码的时候,可以参照我上面给出的流程去试一下,已经写的很详细啦!如果还有什么不懂的地方或者改进的建议,都可以相互 交流学习哦!