今天我尝试在我的Android应用程序中包含apache.commons.codec包,但无法运行它。 Android找不到方法ord.apache.commons.codec.binary。*并在DDMS中输出以下错误
01-12 08:41:48.161:ERROR / 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 /串;
01-12 08:41:48.161:WARN / dalvikvm(457):VFY:拒绝0x0004处的操作码0x71
有关如何解决此问题的任何线索?非常感谢。
答案 0 :(得分:56)
我在使用机器人OAuth library开发时遇到了类似的问题。
我也从android那里得到了,虽然我在类路径中包含了apache.commons.codec
,却找不到特定的方法(encodeBase64String
)。
检查javadocs,这两种方法声称只有 1.4和更高,所以我的猜测是android已经包含了commons.codec
的旧版本,其中这些方法确实未定义。
我的解决方案是使用旧的方法,如下所示:
String encodedString = new String(Base64.encodeBase64('string to encode'));
您要使用的方法不同,因为它将+和/替换为url-safe值 - 和_。所以你可能会使用类似的东西:
String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');
希望有所帮助!
答案 1 :(得分:16)
你不必使用apache commons,在android上你可以使用android.util.Base64代替。
答案 2 :(得分:12)
我遇到了完全相同的问题。所以我开始浏览android源代码,因为事实证明Pablo Fernandez猜测Android有一个org.apache.commons.code.binary的实现是正确的。但是,它的apache公共版本1.2,而不是版本1.4甚至1.5。 你可以在android source中看到自己。
作为注释,这个问题是this post
的副本答案 3 :(得分:8)
您可以使用以下功能:
private static String encodeBase64URLSafeString(byte[] binaryData) {
return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);
}
来源+其他可能的旗帜列表:http://developer.android.com/reference/android/util/Base64.html
答案 4 :(得分:4)
你可以简单地从apache库中复制这个代码位(它非常孤立) <击> http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/apache/commons/codec/binary/Base64.java.htm 击>
修改强> 原版消失后,Wayback Machine更新了链接: http://web.archive.org/web/20130610025148/http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/apache/commons/codec/binary/Base64.java.htm
答案 5 :(得分:4)
我对同一问题的解决方法是将有问题的班级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上失败了......
答案 6 :(得分:2)
请注意,此答案是由Dylan Watson在上面的评论中做出的:
请注意,您需要使用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);
}
此代码段用于 Android应用:
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;
}
答案 7 :(得分:0)
你是否包括apache commons项目lib,比如
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-codec的GAV是
commons-codec:commons-codec
但它的包名是
org.apache.commons.codec
这个包名将与apache commons项目库发生冲突,尝试更改commons-codec的包名,然后将其生成为jar或导入源代码,更改了包名;
答案 8 :(得分:0)
知道这是一个老问题,但我最近在编译API级别 23 时遇到了这个问题,并找到了另一个问题的解决方案:使用 guava 项目。
// Encoding
String encodedString = BaseEncoding.base64().encode(text.getBytes(UTF_8));
System.out.println("encodedString: " + encodedString);
// Decoding
byte[] decodedString = BaseEncoding.base64().decode(encodedString);
System.out.println("decodedString: " + new String(decodedString, UTF_8));
番石榴图书馆( 18.0 )是我使用过的版本,变化很顺利。代码按预期工作。
此处找到解决方案:https://memorynotfound.com/encode-decode-base64-string-using-native-java/
答案 9 :(得分: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;
}
答案 10 :(得分:0)
你可以在 Gradle 依赖下简单地导入以下库
dependencies {
implementation "commons-codec:commons-codec:1.11"
}
它会起作用