前言

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项目中
在这里插入图片描述
最后大功告成!

这里为了方便读者提供一个jar给大家

提供一个常用的加密方式的方法

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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐