51

今天我尝试在我的 Android 应用程序中包含 apache.commons.codec 包,但无法运行。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

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

4

11 回答 11

63

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

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

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

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

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

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

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

希望有帮助!

于 2010-03-28T16:10:06.550 回答
18

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

于 2012-07-07T07:39:46.587 回答
13

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

作为一个注释,这是一个问题是这个帖子的副本

于 2011-05-05T18:10:08.977 回答
10

您可以使用以下功能:

private static String encodeBase64URLSafeString(byte[] binaryData) {

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

    }

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

于 2015-05-18T15:19:40.993 回答
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

于 2011-11-09T01:58:45.930 回答
5

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

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

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

于 2011-11-27T16:44:44.617 回答
3

请注意,这个答案是由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;
    }
于 2015-04-03T01:55:48.710 回答
1

您可以简单地在 Gradle 依赖项下导入以下库

dependencies {
    implementation "commons-codec:commons-codec:1.11"
}

它会工作

于 2021-07-30T04:42:41.730 回答
0

你是否包括了 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-codec 的 GAV 是

commons-codec:commons-codec 

但它的包名是

org.apache.commons.codec

这个包名会和apache commons项目的libs冲突,尝试修改commons-codec的包名,然后生成jar或者导入源代码改过包名;

于 2016-12-23T05:12:49.767 回答
0

知道这是一个老问题,但我最近在为 API Level 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));

guava 库 ( 18.0 ) 是我使用的版本,并且更改很顺利。该代码按预期工作。

在这里找到的解决方案:https ://memorynotfound.com/encode-decode-base64-string-using-native-java/

于 2018-02-07T09:23:10.003 回答
-1

这对我有用:

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;
}
于 2018-07-17T21:33:23.347 回答