Aujourd'hui, j'ai essayé d'inclure le paquet Apache.commons.codec dans mon application Android et je n'ai pas réussi à le faire fonctionner. Android n'a pas pu trouver la méthode ord.Apache.commons.codec.binary. * Et a généré les erreurs suivantes dans DDMS
01-12 08: 41: 48.161: ERREUR/dalvikvm (457): Impossible de trouver la méthode org.Apache.commons.codec.binary.Base64.encodeBase64URLSafeString, référencée depuis la méthode com.dqminh.app.util.Util.Util.sendRequest
01-12 08: 41: 48.161: WARN/dalvikvm (457): VFY: impossible de résoudre la méthode statique 10146: Lorg/Apache/commons/codec/binary/Base64; .encodeBase64URLSafeString ([B) Ljava/lang/String;
01-12 08: 41: 48.161: WARN/dalvikvm (457): VFY: rejet du code opération 0x71 à 0x0004
Un indice sur la façon de résoudre ce problème? Merci beaucoup.
J'ai eu un problème similaire lors de l'utilisation d'Android avec une bibliothèque OAuth je développe.
J'ai aussi reçu d'Android que, bien que j'avais inclus Apache.commons.codec
dans le classpath, une méthode particulière (encodeBase64String
) était introuvable.
En vérifiant les javadocs, les deux méthodes prétendent être 1.4 et supérieures uniquement, donc je suppose qu'Android inclut déjà une version plus ancienne de commons.codec
où ces méthodes sont en réalité non définies.
Ma solution consistait à utiliser une méthode plus ancienne, comme celle-ci:
String encodedString = new String(Base64.encodeBase64('string to encode'));
La méthode que vous voulez utiliser est différente car elle remplace + et/avec des valeurs sûres pour l'URL - et _. Donc, vous pourriez probablement utiliser quelque chose comme:
String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');
J'espère que cela pourra aider!
Vous ne devez pas utiliser Apache commons, sur Android, vous pouvez utiliser Android.util.Base64 à la place.
J'ai eu exactement le même problème. J'ai donc commencé à parcourir le code source Android, et il s'avère que Pablo Fernandez suppose qu'Android a une implémentation de org.Apache.commons.code.binary correct. Cependant, sa version 1.2 de Apache commons, et non la version 1.4 ou même la version 1.5 . Vous pouvez voir par vous-même dans Android source .
en tant que note, cette question est une copie de cet article
Vous pouvez utiliser la fonction suivante:
private static String encodeBase64URLSafeString(byte[] binaryData) {
return Android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);
}
source + liste d'autres drapeaux possibles: http://developer.Android.com/reference/Android/util/Base64.html
Vous pouvez simplement copier ce bit de code de la bibliothèque Apache (il est assez isolé) _ { http://www.Java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/Apache/commons/codec/binary/Base64.Java.htm }
Edit: Le lien mis à jour à partir de la Wayback Machine, l'original ayant disparu: http://web.archive.org/web/20130610025148/http://www.Java2s.com /Open-Source/Android/Blog-Twitter/twitspeak/org/Apache/commons/codec/binary/Base64.Java.htm
Ma solution au même problème consistait à renommer la classe problématique org.Apache.commons.codec.binary.Base64.Java
en org.Apache.commons.codec.binary.ApacheBase64.Java
. Je l'ai fait en utilisant le refactor-renommer Eclipse.
De cette façon, la dernière et la plus grande solution Apache est préservée et utilisée, et il n’ya aucune chance que le problème se répète accidentellement lorsque mon application est finalement levée à partir du plus petit dénominateur d’Android 1.6.
Remarque J'avais l'intégralité de l'arborescence des sources Apache commons définie en tant que projet Java Eclipse distinct, à côté de mon projet Android. Mon projet Android utilisait de nombreuses classes d'Apache Commons, mais avait échoué sous Base64 à cause des problèmes décrits ci-dessus ...
Veuillez noter que cette réponse a été faite par Dylan Watson dans les commentaires ci-dessus:
Sachez que vous devez utiliser Base64.encode ("foobar" .getBytes (), Base64.Base64.NO_WRAP); pour obtenir exactement le même résultat que l'Apache bibliothèque commune. Voir: stackoverflow.com/questions/17912119
Cette réponse est la seule qui a fonctionné après des heures d’essai pour communiquer mon application Android avec une application "de bureau" Java.
Voici donc un code source qui aidera peut-être d’autres:
Code de l'applet desktop:
private static String convertToBase64(String s) {
byte[] bytes = new byte[0];
try {
bytes = (s.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return DatatypeConverter.printBase64Binary(bytes);
}
Cet extrait est utilisé dans l'application 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;
}
Cela fonctionne pour moi:
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;
}
Sachant qu'il s'agit d'une vieille question, j'ai récemment rencontré ce problème lors de la compilation pour le niveau API 23 et ai trouvé une autre solution au problème: utilisez le projet goyave.
// 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 bibliothèque de goyave (18.0) est la version que j'ai utilisée et le changement s'est fait en douceur. Le code fonctionne comme prévu.
Solution trouvée ici: https://memorynotfound.com/encode-decode-base64-string-using-native-Java/
avez-vous inclus Apache commons project lib, comme
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
le GAV du codec commun est
commons-codec:commons-codec
mais c'est le nom du paquet est
org.Apache.commons.codec
ce nom de paquet sera en conflit avec les bibliothèques du projet Apache commons, essayez de modifier le nom du paquet commons-codec, puis générez-le sous forme de fichier jar ou importez le code source si le nom du paquet avait été modifié;