Android studio错误log:java.lang.NoSuchMethodError: No static method encodeBase64String([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)
我们的Android工程要使用A公司提供的技术文档,对一个字符串使用base64进行加密,然后把加密的字符串传给A公司的后台。他们给我们提供的有BASE64加密工具类DesEncrypter.java
和一个测试类WebApitest.java。根据它们提供的加密工具类DesEncrypter,我自行添加了commons-codec-1.10.jar和BASE64.jar这两个jar包,因为工具类中对字符串加密,用到了commons-codec-1.10.jar中的Base64.encodeBase64String(ecipher.doFinal(str.getBytes()))这个方法,对图片的解码,用到了BASE64.jar中的BASE64Decoder这个类及这个类的.decodeBuffer(String)方法。添加完这两个jar包,测试类运行正常,能正常加密,然后把代码添加到Android正式代码里,不报错。然后打包apk安装到手机,运行APP,到加密这一步,报错,错误如下:
这就奇怪了,明明有这个方法,而且测试类能正常运行,安卓代码也没报错,也能成功打包,怎么就报这个错呢?后来上网搜了,说是commons-codec-1.10.jar不是Android的标准APIs,要使用Android自身的base64类里的方法。但是Android自身的base64方法里没有A公司给我们提供的DesEncrypter.java的加密方法,所以放弃,还是用commons-codec-1.10.jar里的org.apache.commons.codec.binary.Base64,还是报上面那个错。后来上网查到要换成Android的base64类,导入android.util.Base64,然后把commons-codec-1.10.jar里的方法Base64.encodeBase64String(ecipher.doFinal(str.getBytes()))转换成android.util.Base64里的Base64.encodeToString(ecipher.doFinal(str.getBytes()),Base64.DEFAULT),就可以解决了。然后按这个方法去改,测试类WebApitest又一直报错,无法对字符串加密。找了很久的问题,就是找不到。后来实在没办法,给A公司打电话,才知道他们提供给我们的方法,是Java后台的方法,Android端用就是会出现那个问题。问题是,他们压根没告诉我那个是Java后台的方法,而且他们知道我们做的是安卓端。
修改前,测试类能用,安卓代码打包运行报错;修改后,测试类报错,因为一直以为都是Android端的代码,测试类报错,Android端肯定也报错,就没再试Android端代码。知道测试类是Java后台代码后,测试类报错就跟Android无关了,然后直接测试Android代码,通过,问题解决了。
/**
* 加密
* @param str 要加密的字符串
* @return
* @throws Exception
*/
public String encrypt(String str) throws Exception {
str = new String(str.getBytes(), "UTF-8");
// return Base64.encodeBase64String(ecipher.doFinal(str.getBytes()));//后台的commons-codec-1.10.jar包里的方法
return Base64.encodeToString(ecipher.doFinal(str.getBytes()),Base64.DEFAULT);//Android自身的BASE64方法
}
第一步:把导入的
import org.apache.commons.codec.binary.Base64;
替换为
import android.util.Base64
第二步:把commons-codec-1.10.jar里的 encodeBase64String()方法,转换为Android自身的BASE64的encodeToString()。见下图: