Frage

Heute habe ich versucht, das apache.commons.codec Paket in meinem Android-Anwendung, einschließlich und nicht bekommen konnte es läuft. Android kann nicht Methode ord.apache.commons.codec.binary finden. * Und gibt die folgenden Fehler in DDMS

  

August 01 bis 12: 41: 48,161: ERROR / dalvikvm (457): Es kann keine Methode org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString finden, von Verfahren com.dqminh.app.util.Util verwiesen. sendrequest

     

August 1-12: 41: 48,161: WARN / dalvikvm (457): VFY: nicht in der Lage statische Methode zu lösen 10146: Lorg / Apache / commons / codec / Binär / Base64; .encodeBase64URLSafeString ([B) Ljava / lang / String;

     

August 01 bis 12: 41: 48,161: WARN / dalvikvm (457): VFY: Ablehnung Opcode 0x71 bei 0x0004

Jeder Hinweis, wie dieses Problem zu lösen? Vielen Dank.

War es hilfreich?

Lösung

Ich hatte ein ähnliches Problem bei der Verwendung von Android mit einer OAuth-Bibliothek Ich bin entwickeln.

ich auch von Android, dass bekam, obwohl ich apache.commons.codec im Classpath aufgenommen hatte, eine bestimmte Methode (encodeBase64String) wurde nicht gefunden.

Überprüfen der javadocs, beide Methoden behaupten zu sein, 1.4 und größer nur , so meine Vermutung ist, dass Android enthält bereits eine ältere Version von commons.codec in denen diese Methoden in der Tat nicht definiert sind.

war meine Lösung eine ältere Methode zu verwenden, wie diese:

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

Die Methode, die Sie verwenden möchten, ist anders, da es + und / mit URL-sicheren Werten ersetzt - und _. So werden Sie wahrscheinlich so etwas wie verwenden können:

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

Ich hoffe, das hilft!

Andere Tipps

Sie müssen nicht Apache commons verwenden, auf Android können Sie android.util.Base64 verwenden statt.

Ich erlebte genau das gleiche Problem. Also begann ich die Android-Quellcode durchsuchen, und wie sich herausstellt Pablo Fernandez Vermutung über Android eine Implementierung von org.apache.commons.code.binary mit korrekt ist. Doch seine Version 1.2 der Apache Commons, nicht Version 1.4 oder sogar 1.5. Sie können für sich selbst in der Androide Quelle .

als Notiz diese Frage ist ein Duplikat diesem Beitrag

Sie können die folgende Funktion verwenden:

private static String encodeBase64URLSafeString(byte[] binaryData) {

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

    }

Quelle + Auflistung anderer möglicher Fahnen: http://developer.android.com/reference/android /util/Base64.html

Meine Lösung für das gleiche Problem war die problematische Klasse org.apache.commons.codec.binary.Base64.java in org.apache.commons.codec.binary.ApacheBase64.java umbenennen. Ich habe es von Eclipse Refactoring-Umbenennungs verwendet wird.

Auf diese Weise die neueste und größte Apache-Lösung erhalten und verwendet wird, und es gibt keine Chance für eine versehentliches Problem Wiederholung, wenn mein app schließlich von Android 1.6 niedrigsten Nenner angehoben wird.

Hinweis hatte ich den gesamten Apache Commons Quellbaum bereits gesetzt als separates Eclipse-Java-Projekt, neben meinem Android-Projekt. Mein Android-Projekt verwendet, um viele von Apache Commons Klassen, aber wegen der oben beschriebenen Probleme auf Base64 gescheitert ...

Bitte beachten Sie, dass diese Antwort gemacht wurde von Dylan Watson in den Kommentaren über:

  

Beachten Sie, dass Sie benötigen Base64.encode ( "foobar" .getBytes () zu verwenden,   Base64.Base64.NO_WRAP); genau das gleiche Ergebnis wie der Apache zu erhalten   commons-Bibliothek. Siehe: stackoverflow.com/questions/17912119

Diese Antwort war die einzige, die nach Stunden gearbeitet versuchen, meine android app mit einem java „Desktop“ app zu kommunizieren.

So, hier sind einige Quellcode, vielleicht wird es andere helfen:

-Code aus dem Desktop-Applet :

   private static String convertToBase64(String s) {
        byte[] bytes = new byte[0];
        try {
            bytes = (s.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return DatatypeConverter.printBase64Binary(bytes);
    }

Dieser Code-Schnipsel in der verwendet Android App :

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

haben sind Sie Apache commons Projekt lib, wie

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

die commons-Codec ‚s GAV beträgt

commons-codec:commons-codec 

aber es ist Paketname ist

org.apache.commons.codec

Dieses Paket Name wird Konflikt mit Apache commons Libs projizieren, versuchen Sie den Paketnamen der commons-Codec zu ändern, erzeugen sie dann als ein Glas oder den Quellcode importieren hatte den Paketnamen geändert;

Zu wissen, dass dies eine alte Frage, aber ich konfrontierte vor kurzem das Problem, wenn für die API-Ebene 23 Kompilieren , und fand eine andere Lösung für das Problem: Verwendung Guave Projekt.

// 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));

Die Guave-Bibliothek ( 18.0 ) war die Version, die ich verwendet habe, und die Änderung war glatt. Der Code funktioniert wie erwartet.

Lösung gefunden hier: https://memorynotfound.com / kodieren-decode-base64-String-mit-native-java /

Dies funktioniert für mich:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top