Android日常开发(23)Android使用commons-codec 进行编码和解码操作java.lang.NoSuchMethodError: No static method
·
前言
commons-codec是Apache开源组织提供的用于摘要运算、编码解码的包。常见的编码解码工具Base64、MD5、Hex、SHA1、DES等。
异常信息
java.lang.NoSuchMethodError: No static method encodeHexString([B)Ljava/lang/String;
in class Lorg/apache/commons/codec/binary/Hex; or its super classes (declaration of
'org.apache.commons.codec.binary.Hex'
appears in /system/framework/org.apache.http.legacy.boot.jar)
原因分析
其根本原因在于android内置了一个Codec库,但是版本过老(1.03),如果使用了外部引入的新版本的codec.jar系统依然会使用内置的codec库,最终导致找不到方法的问题出现。所以解决的最好办法其实是将加密算法放到后台服务中,因为加密会暴露私钥,一旦私钥被别人获取到了。加密便变得毫无意义!!
不过这里我们介绍一种客户端解决问题的方式:
修改codec库的包名,修改的位置最好是com.apache的包名
解决办法
1.下载commons-codec的源码
git clone git@github.com:apache/commons-codec.git
2.使用intellijidea打开项目(因为依赖的三方有点多,所以需要等上一段时间)

找到src目录


包名修改完毕开始打包

再target目录下找到jar包

最后将打包好的jar放入到android项目中

最后大功告成!
提供一个常用的加密方式的方法
public static String generateString(String secretKey,String content) throws Exception{
String[] params=content.split("&");
//数组转集合
List<String> strings=new ArrayList<>();
Collections.addAll(strings,params);
//字典排序
Collections.sort(strings, (o1, o2) -> o1.charAt(0)-o2.charAt(0));
//重新拼接并且加私钥
String newStr= StringUtils.join(strings,'&');
newStr+=secretKey;
//MD5 sign
String md5Str= MD5Util.MD5EncodeForHex(newStr);
//签名转大写
content+="&sign="+md5Str.toUpperCase();
//Base64
Base64 base64=new Base64();
String base64Str=base64.encodeToString(content.getBytes());
//URLEncode
base64Str= URLEncoder.encode(base64Str,"UTF-8");
System.out.println(base64Str);
return base64Str;
}
结束语
喜欢的小伙伴,关注一下或者点个赞谢谢啦!O(∩_∩)O
更多推荐

所有评论(0)