带Android的Apache Commons编解码器:找不到方法
今天,我尝试将apache.commons.codec包包含在我的Android应用程序中,但无法运行。Android找不到方法ord.apache.commons.codec.binary.*并在DDMS中输出以下错误 01-12 08:41:48.161:错误/dalvikvm(457):找不到方法org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString,从方法com.dqminh.app.util.util.sendRequest引用 01-12 08:41:48.161:WARN/dalvikvm(457):VFY:无法解析静态方法10146:Lorg/apache/commons/codec/binary/Base64;。encodeBase64URLSafeString([B)Ljava/lang/String 01-12 08:41:48.161:WARN/dalvikvm(457):VFY:在0x0004处拒绝操作码0x71带Android的Apache Commons编解码器:找不到方法,android,base64,apache-commons-codec,Android,Base64,Apache Commons Codec,今天,我尝试将apache.commons.codec包包含在我的Android应用程序中,但无法运行。Android找不到方法ord.apache.commons.codec.binary.*并在DDMS中输出以下错误 01-12 08:41:48.161:错误/dalvikvm(457):找不到方法org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString,从方法com.dqminh.app.util.util.sendR
关于如何解决这个问题有什么线索吗?非常感谢。我在使用android时遇到了一个类似的问题,我正在开发 我还从android获得了这样的信息,尽管我在类路径中包含了
apache.commons.codec
,但没有找到特定的方法(encodeBase64String
)
查看javadocs,这两种方法都声称只有1.4和更高版本,因此我猜测android已经包含了较旧版本的commons.codec
,其中这些方法确实没有定义
我的解决方案是使用一种较旧的方法,如:
String encodedString = new String(Base64.encodeBase64('string to encode'));
您要使用的方法有所不同,因为它将+和/替换为url安全值-和u。因此,您可能会使用以下方法:
String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');
希望有帮助!我遇到了完全相同的问题。因此我开始浏览android源代码,结果发现Pablo Fernandez关于android实现org.apache.commons.code.binary的猜测是正确的。但是,它的apache commons版本是1.2,而不是1.4甚至1.5。 你可以在android中看到自己
需要注意的是,这个问题是的一个副本,您只需从apache库中复制这个代码位(它是非常独立的) 编辑: 当原始链接消失时,从回程机器更新链接:
我对同一问题的解决方案是将有问题的类
org.apache.commons.codec.binary.Base64.java
重命名为org.apache.commons.codec.binary.ApacheBase64.java
。我使用Eclipse重构重命名
这样,最新和最伟大的apache解决方案就得以保留和使用,当我的应用程序最终从android 1.6最低分母中升级时,就不会出现意外问题
注意,我已经将整个apache commons源代码树设置为单独的Eclipse java项目,与我的Android项目相邻。我的Android项目使用了许多apache commons类,但由于上述问题,在Base64上失败了…您不必使用apache commons,在Android上您可以使用它。请注意,这是一个swer是在上述评论中做出的:
请注意,您需要使用Base64.encode(“foobar”.getBytes(), Base64.Base64.NO_WRAP);以获得与apache完全相同的结果 公共图书馆。见:stackoverflow.com/questions/17912119 这个答案是我在数小时试图用java“桌面”应用程序与android应用程序通信后唯一有效的答案 下面是一些源代码,可能会对其他人有所帮助: 来自桌面小程序的代码:
private static String convertToBase64(String s) {
byte[] bytes = new byte[0];
try {
bytes = (s.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return DatatypeConverter.printBase64Binary(bytes);
}
public static String convertToBase64(String password) {
byte[] bPwd = new byte[0];
try {
bPwd = (password.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
try {
password = new String(Base64.encode(bPwd, Base64.NO_WRAP), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return password;
}
此代码段用于android应用程序中:
private static String convertToBase64(String s) {
byte[] bytes = new byte[0];
try {
bytes = (s.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return DatatypeConverter.printBase64Binary(bytes);
}
public static String convertToBase64(String password) {
byte[] bPwd = new byte[0];
try {
bPwd = (password.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
try {
password = new String(Base64.encode(bPwd, Base64.NO_WRAP), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return password;
}
您可以使用以下功能:
private static String encodeBase64URLSafeString(byte[] binaryData) {
return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);
}
source+其他可能标志的列表:是否包括apache commons项目库,如
org.apache.commons:commons-compress
org.apache.commons:commons-email
org.apache.commons:commons-io
org.apache.commons:commons-lang3
org.apache.commons:commons-parent
org.apache.commons:commons-pool2
commons编解码器的GAV是
commons-codec:commons-codec
但它的包名是
org.apache.commons.codec
此包名将与apache commons项目libs冲突,请尝试更改commons codec的包名,然后将其生成为jar或导入已更改包名的源代码;知道这是一个老问题,但我最近在为API级别23编译时遇到了此问题,并发现了另一个问题问题的解决方法:使用番石榴项目 guava库(18.0)是我使用过的版本,更改很顺利。代码按预期工作 在这里可以找到解决方案:这对我很有用:
import org.apache.commons.codec.binary.Base64;
/**
* This is used to get the base64 from the bytes
*
* @param rawBytes the raw bytes
* @return the base64 encoded string
*/
public static String getBase64String(byte[] rawBytes) {
String base64Str = "";
if (rawBytes!= null) {
base64Str= new String(Base64.encodeBase64(rawBytes));
}
return base64Str;
}
public static byte[] getBase64DecodedString(String base64EncodedStr) {
byte[] base64Bytes = Base64.decodeBase64(base64EncodedStr.getBytes());
return bitmap;
}
你有没有apache.commons.codec中的任何类在工作?那么,仅仅这个类是一个特殊的问题,还是你认为没有一个类可用?我已经为此挣扎了两天了!不过,这只是一个问题,如果我要替换+和-我将如何进行解码?如果原始编码的string(在替换之前)已经包含+和-我想这没关系,您可以像上面的示例一样使用,但需要API级别8(2.2.x)。如果您使用的库依赖于Commons-Codec,则不起作用。请注意,您需要使用
Base64.encode(“foobar.getBytes(),Base64.Base64.NO_-WRAP);
以获得与apache commons库完全相同的结果。请参阅:@DylanWatson:非常感谢!!!我没有设置“NO_WRAP”,这导致了android java和我正在编程的“桌面”java应用程序的通信出现问题。谢谢!!“源”的链接是坏的。你能解决这个问题吗?我和哈希有着完全相同的问题,并且能够以类似的方式解决它(我实际上重构了整个编解码器库的包名)。这对我帮助很大。特别是在使用aws签名生成java类“SignedRequestsHelper”对url进行签名时,该url使用“org.apache.commons.Codec.binary.Base64”但是在安卓系统中,我们必须使用“android.util.Base64”来代替“Base64编码器=新Base64();签名=新字符串(encoder.encode(rawHmac));”和“签名=新字符串(Base64.encode(rawHmac,Base64.NO_WRAP),“UTF-8”);”来让它工作起来。详细的评论是给未来的求助者的。希望它能帮助其他人。谢谢。。。。。