Domanda

Oggi ho provato compreso il pacchetto apache.commons.codec nella mia applicazione Android e non poteva farlo funzionare. Android non riusciva a trovare il metodo ord.apache.commons.codec.binary. * Ed uscita i seguenti errori nel DDMS

  

1-12 Agosto: 41: 48,161: ERRORE / dalvikvm (457): Impossibile trovare il metodo org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString, fa riferimento dal metodo com.dqminh.app.util.Util. sendRequest

     

1-12 Agosto: 41: 48,161: WARN / dalvikvm (457): VFY: in grado di risolvere il metodo statico 10146: Lorg / apache / comuni / codec / binario / Base64; .encodeBase64URLSafeString ([B) Ljava / lang / String;

     

1-12 Agosto: 41: 48,161: WARN / dalvikvm (457): VFY: rifiutando codice operativo 0x71 a 0x0004

Qualsiasi indizio su come risolvere questo problema? Grazie mille.

È stato utile?

Soluzione

Ho avuto un problema simile durante l'utilizzo di Android con un biblioteca OAuth sto sviluppando.

ho ricevuto anche da Android che, anche se avevo inserito apache.commons.codec nel classpath, un particolare metodo (encodeBase64String) non è stato trovato.

Controllo delle javadocs, entrambi i metodi sostengono di essere 1.4 e una maggiore solo , quindi la mia ipotesi è che Android include già una versione precedente di commons.codec dove questi metodi sono davvero indefiniti.

La mia soluzione era quella di utilizzare un metodo più vecchio, in questo modo:

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

Il metodo che si desidera utilizzare è diverso dal momento che sostituisce + e / con i valori url-safe - e _. Quindi probabilmente potrebbe usare qualcosa come:

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

Speranza che aiuta!

Altri suggerimenti

Non è necessario utilizzare comuni apache, su Android è possibile utilizzare android.util.Base64 , invece.

ho sperimentato lo stesso identico problema. Così ho iniziato la navigazione nel codice sorgente di Android, e come si scopre indovinare di Pablo Fernandez su Android avere un'implementazione di org.apache.commons.code.binary è corretta. Tuttavia, la sua versione 1.2 dei beni comuni apache, non la versione 1.4 o addirittura 1.5. Si può vedere per la vostra auto in Android fonte .

Come nota a questo è domanda è un duplicato di questo post

È possibile utilizzare la seguente funzione:

private static String encodeBase64URLSafeString(byte[] binaryData) {

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

    }

fonte + elenco di altre bandiere possibili: http://developer.android.com/reference/android /util/Base64.html

La mia soluzione per lo stesso problema è stato quello di rinominare la org.apache.commons.codec.binary.Base64.java classe problematica in org.apache.commons.codec.binary.ApacheBase64.java. L'ho fatto con Eclipse refactoring-rename.

In questo modo, la soluzione ultima e più grande apache è conservato e utilizzato, e non v'è alcuna possibilità per accidentale problema recidiva quando la mia applicazione è alla fine di essere sollevato da Android 1.6 minimo denominatore.

Si noti che ho avuto l'intero comuni apache albero dei sorgenti già impostato come progetto Eclipse Java separata, accanto al mio progetto Android. Il mio progetto Android utilizzato molte delle classi di Apache Commons, ma non è riuscito a Base64 a causa dei problemi sopra descritti ...

Si prega di notare che questa risposta è stata fatta da Dylan Watson nei commenti di cui sopra:

  

Si tenga presente che è necessario utilizzare Base64.encode (.getBytes "foobar" (),   Base64.Base64.NO_WRAP); per ottenere esattamente lo stesso risultato del apache   biblioteca Commons. Vedere: stackoverflow.com/questions/17912119

Questa risposta è stata l'unica che ha funzionato dopo ore di tentativi di comunicare la mia app Android con un java "desktop" app.

Quindi, ecco qualche codice sorgente, forse sarà aiutare gli altri:

Codice dal applet del 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);
    }

Questo frammento è utilizzato nel 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;
    }

Hai incluso Apache Commons lib del progetto, come

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

il GAV commons-codec s' è

commons-codec:commons-codec 

ma è il nome del pacchetto è

org.apache.commons.codec

questo nome del pacchetto sarà in conflitto con le librerie comuni apache progetto, provare a cambiare il nome del pacchetto di commons-codec, quindi generare come un vaso o importare il codice sorgente aveva cambiato il nome del pacchetto;

Sapendo che si tratta di una vecchia questione, ma ho affrontato questo problema di recente durante la compilazione per l'API livello 23 , e ha trovato un'altra soluzione per il problema: usare guava di progetto.

// 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 libreria guava ( 18,0 ) è stata la versione che ho usato, e il cambiamento è stato liscio. Il codice funziona come previsto.

soluzione trovata qui: https://memorynotfound.com / codifica-decodifica-Base64-string-con-native-java /

Questo funziona per me:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top