Apache Commons Codec con Android: no se pudo encontrar el método

Hoy traté de incluir el paquete apache.commons.codec en mi aplicación Android y no pude ejecutarlo. Android no ha podido encontrar el método ord.apache.commons.codec.binary. * Y muestra los siguientes errores en DDMS

01-12 08: 41: 48.161: ERROR / dalvikvm (457): No se pudo encontrar el método org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString, al que se hace referencia desde el método com.dqminh.app.util.Util.sendRequest

01-12 08: 41: 48.161: WARN / dalvikvm (457): VFY: no se puede resolver el método estático 10146: Lorg / apache / commons / codec / binary / Base64; .encodeBase64URLSafeString ([B) Ljava / lang / String;

01-12 08: 41: 48.161: WARN / dalvikvm (457): VFY: rechazando el código de operación 0x71 en 0x0004

¿Alguna pista sobre cómo resolver este problema? Muchas gracias.

Tuve un problema similar al usar Android con una biblioteca OAuth que estoy desarrollando.

También obtuve de Android que, aunque había incluido apache.commons.codec en el classpath, no se encontró un método particular ( encodeBase64String ).

Comprobando los javadocs, ambos métodos afirman ser solo 1.4 y superiores , así que supongo que Android ya incluye una versión anterior de commons.codec donde estos métodos no están definidos.

Mi solución fue usar un método más antiguo, como este:

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

El método que desea utilizar es diferente ya que reemplaza + y / con valores seguros para url – y _. Entonces probablemente uses algo como:

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

¡Espero que ayude!

No tiene que usar apache commons, en Android puede usar android.util.Base64 en su lugar.

Experimenté exactamente el mismo problema. Así que comencé a buscar el código fuente de Android, y resulta que Pablo Fernández adivinó que Android tenía una implementación de org.apache.commons.code.binary correcta. Sin embargo, su versión 1.2 de apache commons, no la versión 1.4 o incluso 1.5. Puedes ver por ti mismo en la fuente de Android.

como una nota esta es una pregunta es un duplicado de esta publicación

Puede usar la siguiente función:

 private static String encodeBase64URLSafeString(byte[] binaryData) { return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE); } 

fuente + lista de otros posibles indicadores: http://developer.android.com/reference/android/util/Base64.html

Mi solución al mismo problema fue cambiar el nombre de la clase problemática org.apache.commons.codec.binary.Base64.java en org.apache.commons.codec.binary.ApacheBase64.java . Lo hice usando Eclipse refactor-rename.

De esta forma, la mejor y más reciente solución de Apache se conserva y se usa, y no hay posibilidad de que vuelva a ocurrir un problema accidentalmente cuando mi aplicación finalmente sea eliminada del mínimo denominador de Android 1.6.

Tenga en cuenta que tenía todo el árbol fuente de Apache commons ya configurado como proyecto separado de Eclipse java, junto a mi proyecto de Android. Mi proyecto de Android utilizó muchas de las clases de Apache Commons, pero falló en Base64 debido a los problemas descritos anteriormente …

Simplemente podría copiar este código de la biblioteca apache (está bastante aislado) http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/apache/commons/codec/binary/Base64 .java.htm

Editar: El enlace actualizado de Wayback Machine como el original se ha ido: http://web.archive.org/web/20130610025148/http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/ org / apache / commons / codec / binary / Base64.java.htm

Tenga en cuenta que esta respuesta fue hecha por Dylan Watson en los comentarios anteriores:

Tenga en cuenta que necesita utilizar Base64.encode (“foobar” .getBytes (), Base64.Base64.NO_WRAP); para obtener exactamente el mismo resultado que la biblioteca de Apache commons. Ver: stackoverflow.com/questions/17912119

Esta respuesta fue la única que funcionó después de horas de tratar de comunicar mi aplicación de Android con una aplicación de “escritorio” de Java.

Así que aquí hay un código fuente, tal vez ayudará a otros:

Código desde el applet de escritorio :

  private static String convertToBase64(String s) { byte[] bytes = new byte[0]; try { bytes = (s.getBytes()); } catch (Exception e) { e.printStackTrace(); } return DatatypeConverter.printBase64Binary(bytes); } 

Este fragmento se usa en la aplicación de 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; } 

¿Incluiste libche commons project lib, como

 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 

el GAV de commons-codec es

 commons-codec:commons-codec 

pero es el nombre del paquete

 org.apache.commons.codec 

este nombre de paquete entrará en conflicto con las bibliotecas de proyectos de apache commons, intentará cambiar el nombre del paquete de commons-codec, luego lo generará como un jar o importará el código fuente; se cambió el nombre del paquete;

Sabiendo que esta es una vieja pregunta, pero recientemente me enfrenté a este problema al comstackr para API Level 23 , y encontré otra solución para el problema: usar el proyecto de guayaba .

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

La biblioteca de guava ( 18.0 ) fue la versión que he usado, y el cambio fue sencillo. El código funciona como se esperaba.

La solución se encuentra aquí: https://memorynotfound.com/encode-decode-base64-string-using-native-java/

Esto funciona para mí:

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