Apache Commons Codec avec Android: impossible de trouver la méthode

Aujourd’hui, j’ai essayé d’inclure le paquet apache.commons.codec dans mon application Android et je ne pouvais pas le faire fonctionner. Android n’a pas pu trouver la méthode ord.apache.commons.codec.binary. * Et affiche les erreurs suivantes dans DDMS

01-12 08: 41: 48.161: ERROR / dalvikvm (457): Impossible de trouver la méthode org.apache.commons.codec.binary.Base64.encodeBase64URLSafeSsortingng, référencée depuis la méthode com.dqminh.app.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; .encodeBase64URLSafeSsortingng ([B) Ljava / lang / Ssortingng;

01-12 08: 41: 48.161: WARN / dalvikvm (457): VFY: rejet de l’opcode 0x71 à 0x0004

Un indice sur la façon de résoudre ce problème? Merci beaucoup.

J’ai eu un problème similaire en utilisant Android avec une bibliothèque OAuth que je développe.

J’ai aussi reçu d’android que, même si j’avais inclus apache.commons.codec dans le classpath, une méthode particulière ( encodeBase64Ssortingng ) était introuvable.

En vérifiant les javadocs, les deux méthodes prétendent être 1.4 et supérieures seulement , donc je suppose que Android inclut déjà une ancienne version de commons.codec où ces méthodes sont en effet indéfinies.

Ma solution était d’utiliser une méthode plus ancienne, comme ceci:

 Ssortingng encodedSsortingng = new Ssortingng(Base64.encodeBase64('ssortingng to encode')); 

La méthode que vous souhaitez utiliser est différente car elle remplace + et / par des valeurs sécurisées par l’url – et _. Donc, vous utiliserez probablement quelque chose comme:

 Ssortingng encodedSsortingng = new Ssortingng(Base64.encodeBase64('ssortingng to encode')); Ssortingng safeSsortingng = encodedSsortingng.replace('+','-').replace('/','_'); 

J’espère que cela pourra aider!

Vous n’avez pas à utiliser les communités apache, sur Android, vous pouvez utiliser android.util.Base64 à la place.

J’ai vécu exactement le même problème. J’ai donc commencé à parcourir le code source d’android, et il s’avère que Pablo Fernandez pense qu’Android ayant une implémentation d’org.apache.commons.code.binary est correct. Cependant, sa version 1.2 de Apache commons, pas la version 1.4 ou même 1.5. Vous pouvez voir par vous-même dans la source Android.

en tant que note c’est la question est une copie de cet article

Vous pouvez utiliser la fonction suivante:

 private static Ssortingng encodeBase64URLSafeSsortingng(byte[] binaryData) { return android.util.Base64.encodeToSsortingng(binaryData, Base64.URL_SAFE); } 

source + liste d’autres indicateurs possibles: http://developer.android.com/reference/android/util/Base64.html

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

De cette façon, la solution apache la plus récente et la plus performante est préservée et utilisée, et il n’ya aucune chance que le problème se reproduise accidentellement lorsque mon application sera finalement retirée du dénominateur le plus bas d’Android 1.6.

Remarque Je disposais déjà de l’ensemble de l’arborescence source apache commons en tant que projet java séparé d’Eclipse, à côté de mon projet Android. Mon projet Android utilisait de nombreuses classes Apache Commons, mais a échoué sur Base64 en raison des problèmes décrits ci-dessus …

Vous pouvez simplement copier ce code à partir 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: Lien mis à jour depuis la Wayback Machine lorsque l’original est parti: http://web.archive.org/web/20130610025148/http://www.java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/ org / apache / commons / codec / binary / Base64.java.htm

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 la bibliothèque apache commons. Voir: stackoverflow.com/questions/17912119

Cette réponse a été la seule à avoir fonctionné après des heures à essayer de communiquer mon application Android avec une application Java “desktop”.

Donc, voici un code source, peut-être que cela aidera les autres:

Code de l’ applet de bureau :

  private static Ssortingng convertToBase64(Ssortingng 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 Ssortingng convertToBase64(Ssortingng password) { byte[] bPwd = new byte[0]; try { bPwd = (password.getBytes("UTF-8")); } catch (Exception e) { e.printStackTrace(); } try { password = new Ssortingng(Base64.encode(bPwd, Base64.NO_WRAP), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return password; } 

as-tu inclus apache commons projet 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 de commons-codec 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 librairies de projet apache commons, essayez de changer le nom du paquet commons-codec, puis générez-le en tant que jar ou importez le code source ayant changé le nom du paquet;

Sachant que c’est une vieille question, mais j’ai récemment rencontré ce problème lors de la compilation pour API Level 23 , et j’ai trouvé une autre solution au problème: utiliser le projet guava .

 // Encoding Ssortingng encodedSsortingng = BaseEncoding.base64().encode(text.getBytes(UTF_8)); System.out.println("encodedSsortingng: " + encodedSsortingng); // Decoding byte[] decodedSsortingng = BaseEncoding.base64().decode(encodedSsortingng); System.out.println("decodedSsortingng: " + new Ssortingng(decodedSsortingng, UTF_8)); 

La bibliothèque de goyaves ( 18.0 ) était la version que j’ai utilisée, et le changement était sans heurts. Le code fonctionne comme prévu.

Solution trouvée ici: https://memorynotfound.com/encode-decode-base64-ssortingng-using-native-java/

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 ssortingng */ public static Ssortingng getBase64Ssortingng(byte[] rawBytes) { Ssortingng base64Str = ""; if (rawBytes!= null) { base64Str= new Ssortingng(Base64.encodeBase64(rawBytes)); } return base64Str; } public static byte[] getBase64DecodedSsortingng(Ssortingng base64EncodedStr) { byte[] base64Bytes = Base64.decodeBase64(base64EncodedStr.getBytes()); return bitmap; }