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.

¿Fue útil?

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

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top