Вопрос

Сегодня я попытался включить пакет 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:ПРЕДУПРЕЖДЕНИЕ/дальвиквм (457):VFY:не удалось разрешить статический метод 10146:Lorg/apache/commons/codec/binary/Base64;.encodeBase64URLSafeString ([B)Ljava/lang/Строка;

01-12 08:41:48.161:ПРЕДУПРЕЖДЕНИЕ/дальвиквм (457):VFY:отклонение кода операции 0x71 в 0x0004

Есть какие - нибудь подсказки о том, как решить эту проблему?Большое спасибо.

Это было полезно?

Решение

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

У меня тоже от андроида такое было, хотя я включил 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('/','_');

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

Другие советы

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

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

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

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

private static String encodeBase64URLSafeString(byte[] binaryData) {

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

    }

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

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

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

Обратите внимание, что все дерево исходных кодов Apache Commons уже установлено как отдельный Java-проект Eclipse рядом с моим проектом 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/org/apache/commons/codec/binary/Base64.java.htm

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

Имейте в виду, что вам нужно использовать 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 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

GAV кодека Commons

commons-codec:commons-codec 

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

org.apache.commons.codec

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

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

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

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

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top