用Android的Apache Commons Codec:找不到方法

今天我尝试在我的Android应用程序中包含apache.commons.codec包,并且无法运行它。 Android无法find方法ord.apache.commons.codec.binary。*并在DDMS中输出以下错误

01-12 08:41:48.161:错误/ dalvikvm(457):无法find方法org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString,从方法com.dqminh.app.util.Util.sendRequest

01-12 08:41:48.161:WARN / dalvikvm(457):VFY:无法parsing静态方法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开发一个OAuth库时遇到了类似的问题。

我也从android得到,虽然我已经在类path中包含apache.commons.codec ,没有find一个特定的方法( encodeBase64String )。

检查javadocs,这两种方法声称只有1.4和更高 ,所以我的猜测是,android已经包含一个旧版本的commons.codec这些方法确实是不确定的。

我的解决scheme是使用一个老的方法,像这样:

 String encodedString = new String(Base64.encodeBase64('string to encode')); 

你想要使用的方法是不同的,因为它将+和/replace为url安全值 – 和_。 所以你可能会使用像这样的东西:

 String encodedString = new String(Base64.encodeBase64('string to encode')); String safeString = encodedString.replace('+','-').replace('/','_'); 

希望有所帮助!

你不必使用apache commons,在android上你可以使用android.util.Base64来代替。

我经历了完全相同的问题。 所以我开始浏览Android源代码,事实certificate,Pablo Fernandez关于Android的猜测有一个org.apache.commons.code.binary的实现是正确的。 但是,它的1.2版本的Apache公共版本,不是1.4版本甚至1.5版本。 你可以在Android 源代码中看到你的自我。

作为一个注意这是问题是这个职位的重复

您可以使用以下function:

 private static String encodeBase64URLSafeString(byte[] binaryData) { return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE); } 

源+其他可能的标志清单: http : //developer.android.com/reference/android/util/Base64.html

我对同样问题的解决scheme是将有问题的类org.apache.commons.codec.binary.Base64.java重命名为org.apache.commons.codec.binary.ApacheBase64.java 。 我做了使用Eclipse重构重命名。

这样,最新的和最伟大的apache解决scheme被保留和使用,并且当我的应用程序最终被从android 1.6最低分母中解除时,意外问题重现的机会是没有的。

注意我已经把整个apache commons源代码树设置为独立的Eclipse java项目,在我的Android项目旁边。 我的Android项目使用了许多Apache Commons类,但由于上述问题,在Base64上失败了…

你可以简单地从apache库复制这个代码(这是相当孤立的) http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/apache/commons/codec/binary/Base64 .java.htm

编辑:更新从Wayback机器的链接,原来不见了: http ://web.archive.org/web/20130610025148/http: //www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/组织/阿帕奇/公/编解码器/二进制/ Base64.java.htm

请注意,这个答案是由Dylan Watson在上面的评论中作出的:

请注意,您需要使用Base64.encode(“foobar”.getBytes(),Base64.Base64.NO_WRAP); 得到与apache commons库完全相同的结果。 请参阅:stackoverflow.com/questions/17912119

这个答案是经过几个小时试图沟通我的android应用程序与Java“桌面”应用程序的唯一工作。

所以这里有一些源代码,也许它会帮助其他人:

来自桌面小程序的代码:

  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; } 

你包括Apache公共项目库,像

 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 

共享编解码器的GAV是

 commons-codec:commons-codec 

但它的包名是

 org.apache.commons.codec 

这个包名将与apache commons项目库冲突,尝试改变commons-codec的包名,然后将其生成为jar或者导入源代码,改变了包名;