Apache Commons Codec con Android: no se pudo encontrar el método
-
20-09-2019 - |
Pregunta
Hoy he probado incluyendo el paquete apache.commons.codec en mi aplicación Android y no podía ponerlo en marcha. Android no podía encontrar el método ord.apache.commons.codec.binary. * Y la salida de 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, referenciado desde com.dqminh.app.util.Util método. sendRequest
01-12 08: 41: 48.161: WARN / dalvikvm (457): VFY: no puede resolver método estático 10146: LORG / Apache / comunes / codec / binario / Base64; .encodeBase64URLSafeString ([B) Ljava / lang / cadena;
01-12 08: 41: 48.161: WARN / dalvikvm (457): VFY: rechazar opcode 0x71 en 0x0004
Cualquier idea de cómo solucionar este problema? Muchas gracias.
Solución
Yo tenía un problema similar durante el uso de android con un biblioteca de OAuth estoy desarrollando.
También me dio de androide que, aunque había incluido apache.commons.codec
en la ruta de clase, no se encontró un método particular (encodeBase64String
).
Comprobación de los javadocs, ambos métodos pretenden ser 1.4 y mayor única , así que yo creo es que Android ya incluye una versión anterior de commons.codec
donde estos métodos son de hecho indefinido.
Mi solución fue utilizar un método más antiguo, como esto:
String encodedString = new String(Base64.encodeBase64('string to encode'));
El método que desea utilizar es diferente ya que reemplaza + y / url con los valores de seguridad - y _. Por lo que probablemente podría utilizar algo como:
String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');
Espero que ayude!
Otros consejos
Usted no tiene que utilizar apache commons, en android puede utilizar android.util.Base64 su lugar.
he experimentado el mismo problema. Así que empecé a navegar por el código fuente de Android, y como resulta que la suposición de Pablo Fernández acerca de Android que tiene una implementación de org.apache.commons.code.binary es correcta. Sin embargo, su versión 1.2 de los comunes Apache, no la versión 1.4 o incluso 1.5. Se puede ver por ti mismo en el androide fuente .
como una nota de esto es cuestión es un duplicado de este post
Puede utilizar la siguiente función:
private static String encodeBase64URLSafeString(byte[] binaryData) {
return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);
}
fuente + lista de posibles otras banderas: http://developer.android.com/reference/android /util/Base64.html
Mi solución al mismo problema fue cambiar el nombre de la clase org.apache.commons.codec.binary.Base64.java
problemática en org.apache.commons.codec.binary.ApacheBase64.java
. Lo hice usando Eclipse-refactor de cambio de nombre.
De este modo, la solución mejor y más nuevo Apache se conserva y utiliza, y no hay ninguna posibilidad de recurrencia del problema accidental cuando mi aplicación, finalmente está siendo levantado desde Android 1.6 denominador más bajo.
Tenga en cuenta que tenía todo el árbol fuente de Apache Commons ya establecer como proyecto Eclipse Java por separado, al lado de mi proyecto Android. Mi proyecto Android utiliza muchas de las clases de Apache Commons, pero falló en la base 64 debido a problemas descritos anteriormente ...
Usted podría simplemente copiar este bit de código de la biblioteca Apache (que es bastante aislada)
http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/apache/commons/codec/binary/Base64.java.htm
Editar enlace actualizado de la Wayback Machine que 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 hecho por Dylan Watson en los comentarios anteriores:
Tenga en cuenta que es necesario utilizar Base64.encode (.getBytes "foobar" (), Base64.Base64.NO_WRAP); para obtener exactamente el mismo resultado que el Apache biblioteca de recursos comunes. Ver: stackoverflow.com/questions/17912119
Esta respuesta fue el único que funcionaba después de horas de intentar comunicar mi aplicación para Android con una aplicación de java "escritorio".
Así que aquí hay un código fuente, tal vez va a ayudar a los demás:
Código de la 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 utiliza en el aplicación androide :
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;
}
¿Incluyó Apache lib proyecto de bienes comunes, 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 commons-codec 's GAV es
commons-codec:commons-codec
pero es el nombre del paquete es
org.apache.commons.codec
Este nombre de paquete estará en conflicto con libs proyecto apache commons, intenta cambiar el nombre del paquete de commons-codec, a continuación, generar como un frasco o importar el código fuente se había cambiado el nombre del paquete;
Sabiendo que esto es una cuestión de edad, pero se enfrentó a este problema recientemente cuando se compila para API Nivel 23 , y se encontró otra solución para el problema: use guayaba proyecto.
// 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 guayaba ( 18,0 ) fue la versión que he utilizado, y el cambio era lisa. El código funciona como se esperaba.
Solución encontrado aquí: https://memorynotfound.com / codificación-decodificación base 64-cuerdas-usando-nativo-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;
}