Question

Aujourd'hui, j'ai essayé, y compris le paquet apache.commons.codec dans mon application Android et ne pouvait pas le faire fonctionner. Android n'a pas pu trouver la méthode ord.apache.commons.codec.binary. * Et sortie les erreurs suivantes dans DDMS

  

1 au 12 août: 41: 48,161: ERREUR / dalvikvm (457): Impossible de trouver la méthode org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString, référencé à partir méthode com.dqminh.app.util.Util. sendRequest

     

1 au 12 août: 41: 48,161: WARN / dalvikvm (457): VFY: incapable de résoudre méthode statique 10146: LORG / apache / communes / codec / binaire / base64; .encodeBase64URLSafeString ([B) Ljava / lang / string;

     

1 au 12 août: 41: 48,161: WARN / dalvikvm (457): VFY: rejet opcode 0x71 à 0x0004

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

Était-ce utile?

La solution

J'ai eu un problème similaire en utilisant android avec un bibliothèque OAuth Je développe.

Je suis aussi d'Android, même si je l'avais inclus apache.commons.codec dans le classpath, une méthode particulière (encodeBase64String) n'a pas été trouvé.

Vérification des javadocs, les deux méthodes prétendent être 1.4 et plus seulement , donc je suppose que Android comprend déjà une version plus ancienne de commons.codec où ces méthodes sont en effet non défini.

Ma solution a été d'utiliser une méthode plus ancienne, comme ceci:

String encodedString = new String(Base64.encodeBase64('string to encode'));

La méthode que vous voulez utiliser est différent car il remplace + et / avec des valeurs de sécurité url - et _. Donc, vous pourriez probablement utiliser quelque chose comme:

String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');

L'espoir qui aide!

Autres conseils

Vous ne devez pas utiliser apache communes, sur Android, vous pouvez utiliser android.util.Base64 au lieu.

J'ai vécu exactement le même problème. Alors je commencé à naviguer le code source Android, et il se trouve que la conjecture de Pablo Fernandez à propos de Android ayant une implémentation de org.apache.commons.code.binary est correcte. Cependant, sa version 1.2 des communes apache, pas la version 1.4 ou même 1.5. Vous pouvez voir pour votre auto dans l'androïde la source .

comme une note c'est question est un double de ce post

Vous pouvez utiliser la fonction suivante:

private static String encodeBase64URLSafeString(byte[] binaryData) {

        return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);

    }

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

Ma solution au même problème a été de renommer le org.apache.commons.codec.binary.Base64.java de classe problématique en org.apache.commons.codec.binary.ApacheBase64.java. Je l'ai fait en utilisant Eclipse refactor-renommage.

De cette façon, la dernière et la plus grande solution apache est conservée et utilisée, et il n'y a aucune chance de récidive du problème accidentel lorsque mon application est finalement soulevé d'Android 1.6 plus petit dénominateur.

Notez que j'avais l'arbre source toute commons apache déjà défini comme projet java Eclipse séparé, à côté de mon projet Android. Mon projet Android utilisé beaucoup de classes Apache Commons, mais a échoué sur base64 en raison des problèmes décrits ci-dessus ...

S'il vous plaît 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 communs. Voir: stackoverflow.com/questions/17912119

Cette réponse a été le seul qui a travaillé après les heures d'essayer de communiquer mon application Android avec une application « desktop » java.

Voici donc un code source, peut-être il aider les autres:

code de la applet de bureau :

   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 le app 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;
    }

Avez-vous inclus projet commun apache 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

GAV du commons-codec est

commons-codec:commons-codec 

mais il est le nom du paquet est

org.apache.commons.codec

ce nom de package sera en conflit avec projet commun apache libs, essayez de changer le nom du paquet des communes-codec, puis générer comme un pot ou d'importer le code source avait changé le nom du paquet;

Sachant que c'est une vieille question, mais je fait face à ce problème récemment lors de la compilation de l'API Niveau 23 , et a trouvé une autre solution pour le problème: utiliser goyave projet.

// 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 je l'ai utilisé, et le changement était lisse. Le code fonctionne comme prévu.

Solution trouvée ici: https://memorynotfound.com / encode-decode-base64-string-en utilisant natif-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 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top