Кодек Apache Commons для Android:не удалось найти метод
-
20-09-2019 - |
Вопрос
Сегодня я попытался включить пакет 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;
}