queda - gradle project sync failed android studio
Apache Commons Codec con Android: no se pudo encontrar el método (10)
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.
¿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;
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;
}
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 source Android.
como una nota esta es una pregunta es un duplicado de esta publicación
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 ...
No tiene que usar apache commons, en Android puede usar android.util.Base64 lugar.
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: android.util.Base64
Sabiendo que esta es una vieja pregunta, pero recientemente me enfrenté a este problema al compilar 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/
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: .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;
}
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!