Кодек Apache Commons с Android: не удалось найти метод - PullRequest
45 голосов
/ 12 января 2010

Сегодня я попытался включить пакет 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 / Строка;

01-12 08: 41: 48.161: WARN / dalvikvm (457): VFY: отклонение кода операции 0x71 при 0x0004

Любая подсказка о том, как решить эту проблему? Большое спасибо.

Ответы [ 10 ]

56 голосов
/ 28 марта 2010

У меня была похожая проблема при использовании Android с библиотекой OAuth Я занимаюсь разработкой.

Я также получил от Android, что, хотя я включил apache.commons.codec в classpath, определенный метод (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('/','_');

Надеюсь, это поможет!

16 голосов
/ 07 июля 2012

Вам не нужно использовать Apache Commons, на Android вы можете использовать android.util.Base64 .

12 голосов
/ 05 мая 2011

У меня возникла точно такая же проблема. Поэтому я начал просматривать исходный код Android, и, как оказалось, предположение Пабло Фернандеса о том, что Android имеет реализацию org.apache.commons.code.binary, является правильным. Тем не менее, его версия 1.2 Apache Commons, а не версия 1.4 или даже 1.5. Вы можете увидеть для себя в Android источник .

как примечание, этот вопрос является дубликатом этого сообщения

8 голосов
/ 18 мая 2015

Вы можете использовать следующую функцию:

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 голосов
/ 27 ноября 2011

Моим решением той же проблемы было переименование проблемного класса org.apache.commons.codec.binary.Base64.java в org.apache.commons.codec.binary.ApacheBase64.java. Я сделал это, используя Eclipse refactor-rename.

Таким образом, новейшее и лучшее решение Apache сохраняется и используется, и нет никаких шансов для случайного повторения проблемы, когда мое приложение в конечном итоге поднимается с наименьшего знаменателя Android 1.6.

Примечание. У меня все дерево исходников Apache Commons уже установлено как отдельный Java-проект Eclipse, рядом с моим проектом Android. В моем проекте для Android использовались многие классы Apache Commons, но на Base64 произошел сбой из-за описанных выше проблем ...

4 голосов
/ 09 ноября 2011

Вы можете просто скопировать этот бит кода из библиотеки apache (он довольно изолирован) http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/apache/commons/codec/binary/Base64.java.htm

Edit: Обновленная ссылка с 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

2 голосов
/ 03 апреля 2015

Обратите внимание, что этот ответ был сделан Диланом Уотсоном в комментариях выше:

Помните, что вам нужно использовать Base64.encode ("foobar" .getBytes (), Base64.Base64.NO_WRAP); чтобы получить точно такой же результат, как Apache библиотека общего пользования. См .: 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;
    }
0 голосов
/ 18 июля 2018

Это работает для меня:

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;
}
0 голосов
/ 07 февраля 2018

Зная, что это старый вопрос, но я недавно столкнулся с этой проблемой при компиляции для уровня API 23 и нашел другое решение проблемы: используйте guava project.

// 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/

0 голосов
/ 23 декабря 2016

вы включили apache commons project 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

GAV общего кодека составляет

commons-codec:commons-codec 

но это имя пакета

org.apache.commons.codec

это имя пакета будет конфликтовать с библиотеками проекта apache commons, попробуйте изменить имя пакета commons-codec, затем сгенерируйте его как jar или импортируйте исходный код, изменив имя пакета;

...