web-dev-qa-db-fra.com

Apache Commons Codec avec Android: méthode introuvable

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.

44
dqminh

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!

55
Pablo Fernandez

Vous ne devez pas utiliser Apache commons, sur Android, vous pouvez utiliser Android.util.Base64 à la place.

16
Mootaz Dinana

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

12
zarthross

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

8
RWIL

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

4

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

4
R. Simac

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;
    }
2
Martin Pfeffer

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;
}
0
Vicky Kapadia

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/

0
pringi

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é;

0
user3125139