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

dqm*_*inh 47 base64 android apache-commons-codec

今天我尝试在我的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/String;

01-12 08:41:48.161:WARN/dalvikvm(457):VFY:在0x0004拒绝操作码0x71

有关如何解决这个问题的任何线索?非常感谢.

Pab*_*dez 60

在我正在开发的OAuth库中使用android时遇到了类似的问题.

我也从android得到了,虽然我已经包含apache.commons.codec在类路径中,encodeBase64String但是找不到特定的方法().

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

我的解决方案是使用较旧的方法,如下所示:

String encodedString = new String(Base64.encodeBase64('string to encode'));
Run Code Online (Sandbox Code Playgroud)

您要使用的方法不同,因为它将+和/替换为url-safe值 - 和_.所以你可能会使用类似的东西:

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

希望有所帮助!


小智 16

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

  • 请注意,您需要使用`Base64.encode("foobar".getBytes(),Base64.Base64.NO_WRAP);`以获得与apache commons库完全相同的结果.请参阅:http://stackoverflow.com/questions/17912119 (7认同)
  • 有用,但需要API级别8(2.2.x). (4认同)
  • 如果您使用的库依赖于Commons-Codec,则不起作用. (2认同)

zar*_*oss 12

我遇到了完全相同的问题.所以我开始浏览android源代码,因为事实证明Pablo Fernandez猜测Android有一个org.apache.commons.code.binary的实现是正确的.但是,它的apache公共版本1.2,而不是版本1.4甚至1.5.你可以在android 源代码中看到你自己.

作为注释,这个问题是这篇文章的重复


RWI*_*WIL 9

您可以使用以下功能:

private static String encodeBase64URLSafeString(byte[] binaryData) {

        return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);

    }
Run Code Online (Sandbox Code Playgroud)

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


Sve*_*son 5

您可以简单地从 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


R. *_*mac 5

我对同一问题的解决方案是将有问题的类重命名org.apache.commons.codec.binary.Base64.javaorg.apache.commons.codec.binary.ApacheBase64.java. 我使用 Eclipse refactor-rename 做到了。

这样,最新和最好的 apache 解决方案被保留和使用,并且当我的应用程序最终从 android 1.6 最低分母中解除时,不会有意外问题再次发生的机会。

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