Apache Commons Codec с Android: не удалось найти метод

Сегодня я попытался включить пакет apache.commons.codec в приложение для Android и не смог запустить его. 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: отклонение кода операции 0x71 при 0x0004

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

Ответ 1

У меня была аналогичная проблема при использовании android с OAuth library Я разрабатываю.

Я также получил от android, что, хотя я включил apache.commons.codec в путь к классам, не был найден конкретный метод (encodeBase64String).

Проверяя javadocs, оба метода утверждают, что они 1.4 и выше только, поэтому я предполагаю, что андроид уже включает более старую версию commons.codec, где эти методы действительно undefined.

Моим решением было использовать более старый метод, например:

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

Метод, который вы хотите использовать, отличается от того, что он заменяет + и/с безопасными по URL значениями - и _. Поэтому вы, вероятно, можете использовать что-то вроде:

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

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

Ответ 2

Вам не нужно использовать apache commons, на андроиде вы можете использовать android.util.Base64.

Ответ 3

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

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

Ответ 4

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

private static String encodeBase64URLSafeString(byte[] binaryData) {

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

    }

источник + список других возможных флагов: http://developer.android.com/reference/android/util/Base64.html

Ответ 5

Вы можете просто скопировать этот бит кода из библиотеки 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

Ответ 6

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

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

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

Ответ 7

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

Помните, что вам нужно использовать Base64.encode( "foobar".getBytes(), Base64.Base64.NO_WRAP); получить тот же результат, что и apache общая библиотека. Смотрите: stackoverflow.com/questions/17912119

Этот ответ был единственным, который работал после нескольких часов, пытаясь сообщить мое приложение Android с помощью приложения java "desktop".

Итак, вот какой-то исходный код, возможно, это поможет другим:

Код из настольного апплета:

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

Ответ 8

Вы включили проект apache commons project, например

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 project libs, попробуйте изменить имя пакета commons-codec, затем сгенерировать его как банку или импортировать исходный код, изменив имя пакета;