¿Existe una biblioteca Base64 que sea compatible con Android y Java
Tengo una biblioteca común que utilizo para proyectos Java y Android y requiere un codificador / decodificador base64. El problema es que la biblioteca Apache commons no funciona con Android, al menos no que he podido implementar con éxito – debido a Android ya implementar y la versión anterior y por lo tanto causar un error en tiempo de ejecución siempre que intento codificar o decodificar:
Base64.decodeBase64
Devuelve el error:
- AutoCompleteTextView fuerza para mostrar todos los elementos
- Alcance de System.setProperty
- IOException durante la lectura de InputStream
- GetContentResolver () y getWindow () en un DialogFragment
- Comunicación con Java socket de Android con Socket.IO
AndroidRuntime(1420): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64
Si alguien conoce una biblioteca de base64 que es compatible con Java y Android, o puede explicarme cómo solucionar el problema de los comunes de Apache, estaría muy agradecido. : ^)
- ¿El módulo no puede ser Android Library?
- Cuando se utiliza la pantalla activity.recreate () parpadea en negro durante 0,5 segundos
- Cómo agregar fuente de 'Android Private Libraries' a ADT eclipse?
- Fuera de memoria usando Retrofit 2 para descargar un archivo
- Ya administra un GoogleApiClient con id 0 En FRAGMENT
- Cómo mover el elemento específico en la lista de arreglos al primer elemento
- Accediendo simultáneamente a diferentes miembros del mismo objeto en Java
- GetAction () sólo da ACTION_DOWN
Sólo hay "base64". Es tan trivial que usted puede google para cualquier "java base64" y utilizar cualquier aplicación.
EDITAR
Si apuntas a pre API8, simplemente toma la fuente de la implementación de Base64 desde API8 (es android / util / Base64.java ) y copia en tu proyecto.
Toma el tuyo.
Aquí está la descodificación:
static private int FromBase64Char(int c) { if(c >= 'A' && c <= 'Z') return c - 'A'; else if(c >= 'a' && c <= 'z') return c - 'a' + 26; else if(c >= '0' && c <= '9') return c - '0' + 52; else if(c == '+') return 62; else if(c == '/') return 63; else throw new IllegalArgumentException(); //Depends on how do you want to handle invalid characters } static public byte[] FromBase64(String s) throws IllegalArgumentException { if(s == null) return null; int l = s.length(); if(l == 0) return new byte[0]; if(l % 4 != 0) throw new IllegalArgumentException(); boolean Padded = (s.charAt(l-1) == '='); boolean Padded2 = (s.charAt(l-2) == '='); int ll = (Padded ? l-4 : l); int triad; byte [] b = new byte[(ll*3)/4 + (Padded ? (Padded2 ? 1 : 2) : 0)]; int i, j = 0; for(i=0; i<ll; i+=4) { triad = (FromBase64Char(s.charAt(i)) << 18) | (FromBase64Char(s.charAt(i+1)) << 12) | (FromBase64Char(s.charAt(i+2)) << 6) | FromBase64Char(s.charAt(i+3)); b[j++] = (byte)((triad >> 16) & 0xff); b[j++] = (byte)((triad >> 8) & 0xff); b[j++] = (byte)(triad & 0xff); } //The final chunk if(Padded) { if(Padded2) //Padded with two ='s { triad = (FromBase64Char(s.charAt(ll)) <<2 ) | (FromBase64Char(s.charAt(ll+1)) >> 4); b[j++] = (byte)triad; } else //Padded with one = { triad = (FromBase64Char(s.charAt(ll)) << 10) | (FromBase64Char(s.charAt(ll+1)) << 4) | (FromBase64Char(s.charAt(ll+2)) >> 2); b[j++] = (byte)((triad >> 8) & 0xff); b[j++] = (byte)(triad & 0xff); } } return b; }
Y aquí está la codificación:
private final static String BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", PAD1 = "=", PAD2 = "=="; static public String ToBase64(final byte [] a) { int l = a.length; StringBuilder sb = new StringBuilder((l+3)*4/3); int i; int mod = l % 3; int ll = l - mod; int triad; for(i=0;i<ll;i+=3) { triad = (a[i]<<16) | (a[i+1]<<8) | a[i+2]; sb.append(BASE64_ALPHABET.charAt((triad >> 18) & 0x3f)); sb.append(BASE64_ALPHABET.charAt((triad >> 12) & 0x3f)); sb.append(BASE64_ALPHABET.charAt((triad >> 6) & 0x3f)); sb.append(BASE64_ALPHABET.charAt(triad & 0x3f)); } if(mod == 1) { sb.append(BASE64_ALPHABET.charAt((a[i] >> 2) & 0x3f)); sb.append(BASE64_ALPHABET.charAt((a[i] << 4) & 0x3f)); sb.append(PAD2); } if(mod == 2) { triad = (a[i]<<8) | a[i+1]; sb.append(BASE64_ALPHABET.charAt((triad >> 10) & 0x3ff)); sb.append(BASE64_ALPHABET.charAt((triad >> 4) & 0x3f)); sb.append(BASE64_ALPHABET.charAt((triad << 2) & 0x3f)); sb.append(PAD1); } return sb.toString(); }
En mi aplicación, utilizo jackson y proporciona un codificador / descodificador base64, puedes usarlo si tu aplicación utiliza también Jackson.
import com.fasterxml.jackson.core.Base64Variants; public class Foo { String encodeBase64(byte[] string) { return Base64Variants.getDefaultVariant().encode(string.getBytes()); } }
- Android ¿Cómo puedo emular el comportamiento de @android: id / empty en un GridView?
- Android Camera – ¿Cómo puedo tomar un "rectángulo" específico de la matriz de bytes?