IllegalArgumentException Base64 image decoding android
Ich entschlüsseln will, ein Bild von webservice-was ist in base64 zu der bitmap und verwenden Sie es in meine android-app.
Dies ist meine Methode:
public Bitmap getCaptcha() throws IOException
{
List<NameValuePair> params = new ArrayList<NameValuePair>();
String json = jsonParser.getCaptcha(captchaURL, params);
Log.i("", json);
byte [] encodeByte=Base64.decode(json.getBytes(),Base64.DEFAULT);
Bitmap bitmap=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
return bitmap;
}
Wenn ich das decodieren der Zeichenfolge, die ich bekommen aus getCaptcha Methode mit meinem php-script zeigt es korrekt an. Aber wenn ich das in meiner Anwendung, ich bekomme eine
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.assignmentexpert/com.assignmentexpert.RegisterActivity}: java.lang.IllegalArgumentException: bad base-64
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: bad base-64
at android.util.Base64.decode(Base64.java:161)
at android.util.Base64.decode(Base64.java:136)
at com.library.UserFunctions.getCaptcha(UserFunctions.java:97)
at com.assignmentexpert.RegisterActivity.onCreate(RegisterActivity.java:66)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
Was ist der Grund?
Ich hinzufügen base64-code, den ich bekommen:
/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gMTUK/9sAQwA1JSgvKCE1LysvPDk1P1CFV1BJSVCjdXthhcGqy8i+qrq31fD//9Xi/+a3uv///////////87//////////////9sAQwE5PDxQRlCdV1ed/9y63P///////////////////////////////////////////////////////////////////8AAEQgAKAB4AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A0mOBkUtI/T8R/OgjPcj6UADOF6nn0qjd3jqdkfynuamnfYRFCMyt39BVS8RYI0jHLH5mPrTSAmtJJHjJZyTnvVpSyjoGHqKhsRtts5wSan4bkA59qTDQY9yquqbW3N0BGKJJjEhd1+UehqnJl5VmJJHmBB9K0Nif3R+VFgsQC/hPcj6inrdRv93mla3ibqo/CqF7bpBtZCRntTCxo7nPRMfU1FPL5SFmfJ7KKisCZIzvyQOmaNQ4aEdF3f4UrBYWO6lVlFwm0N0PpVyorlQ9tID/AHSaLZ99ujHk45oAlooooAR/u/TmmTyiGMseT0A9TT3+430qO4hWZAG6A54oAii2wjdKw81+SSRxVG8ZXnJUgjHUHNX1sogP9WCfUk1UvoREylVABHamhlm0liESqWXdT7yXy4vlPztwKgtYYWiV2Q7s9RU1xA85R0YKV6ZFLqIhnTyraFSOjjn86vKyuMqQR7VnzwzfuxNLu3OBgVacx28XyjhewPNDAZJFchmaKbIJztPaqbcSf6VvzWjHOkg+Vwahvnj8kqcbu1NMCa3eJo8RYwO1Nu4PPjwDhgciqenBvNJGcYrQkkESF26Ck9GBTZ7oxGJo+oxv9qnsf+PRPx/nTJ72PyWCHLEYAqa2Qx26KeuOaYEtFFFIAIyCD0NJjLD0FFFAC0yVUcAOob0BoooAI4ljGFAFOKgnPf2oooAY0KuylsnacjJp5UEYIGKKKAIHs4X527T7UwafEDyWNFFFwLMcaRLtQYFKyhhhgCPQ0UUAMFvEGyI1z9KkwKKKACiiigD/2Q==n
Problem ist, dass wenn ich kopieren Sie den code aus dem browser und hartcodieren mein Programm - alles funktioniert einwandfrei. Aber wenn ich das base64-Daten über mein android-Programm und versuchen Sie zu fest die base64 - bekomme ich eine exception. Code, der im browser und was bekomme ich per Android gleich aussieht. Aber praktisch ist es nicht, weil anderes Ergebnis)
InformationsquelleAutor Rikki Tikki Tavi | 2012-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie die Polsterung von deinem Base64 code ist nicht gut (falsche Anzahl der nachfolgende
=
Zeichen am Ende des Codes). Zum Beispiel, der base64-code entsprechendHello
istSGVsbG8=
, und die letzten=
ist nur da, um die Größe der base64-Daten chunck konform mit den Base64-RFC. SoSGVsbG8==
undSGVsbG8
sind beide falsch, da die Länge der chunckist nicht entsprechend der base64-Spezifikation, auch wenn Sie beide bedeuten
Hello
wenn wir weiterhin relevante Zeichen (das "Base-64-Alphabet").Einige Implementierungen sind Recht Freizügig darüber. Sie vermuten nur, dass die eine base64-chunck, eine falsche Länge muss das Auffüllen mit ein oder zwei "=". Einige andere, darunter Android, sind nicht permissiv, also die Art von Diskrepanz, die Sie konfrontiert sind, zwischen den Verhaltensweisen von PHP-und Android-Programme.
Dies ist nur eine Vermutung, da ich nicht sehen kann, der base64-Daten, die Sie versuchen zu decodieren. Um zu überprüfen, die Sie verwenden können,diese online base64 decoder, die wird Ihnen sagen, ob die Polsterung ist ok.
Jedenfalls wäre es einfacher mit einer Probe von deinem base64 code. Würden Sie hinzufügen, um Ihre post? Ich werde aktualisieren, meine Antwort entsprechend.
Es ist ein
n
nach der trailing=
am Ende des Codes. Dies macht die base64-Daten chunck ungültig. Einmal gelöscht, der rest ist gültig, ich konnte Sie entschlüsseln, kein problem. Vielleicht ist das problem kommt von Ihrem service. Es scheint ein\n
line termination Charakter wurde irrtümlich falschn
im service-code.EEEEEEEEEEEEEE!!!!!ich danke Ihnen sehr!!!!!!wie könnte man das fest??? Ich Frage mich - was ist der Grund dafür? web-service senden Sie die Daten richtig - weil es zeigt, korrekt im browser...warum dieses "n" appeat auf meine client-Seite? Ich Anfrage senden und sollte erhalten die gleichen Daten...aber es geht nicht...sehr komisch...danke sehr...
Sie sind willkommen 🙂 Vielleicht ist der Fehler in Ihrem Android-client, der versucht, fügen Sie eine
\n
um die Daten, die es liest. Ich bin jedenfalls nur raten, aber lassen Sie es mich wissen 🙂das problem ist nicht \n, sondern nur n... - Client fügt n als letztes symbol...exluding es aus dem string die Daten aus dem webservice das problem gelöst. Danke.
InformationsquelleAutor Shlublu
Tatsächlich gibt es eine einfache Lösung dafür, die wird entfernen Sie alle fehlerhaften Daten, nachdem eine gültige base64-string:
InformationsquelleAutor RoninSeito
War das problem beim hinzufügen JSON-Antwort ein "n" - Zeichen am Ende der base64-Zeichenfolge des Bildes ein. Der Grund dafür Gewand ist mystisch. Interessant, dass andere JSON-Antwort von diesem webservice ohne "n" - Zeichen. Ich habe versucht zu bekommen, dass die Zeichenkette von base64-Bild mit regulären Java-code - alles war gut - ohne "n" - Zeichen. So ist es Gewand durch android-client - Seite. Versuchen Sie, zu untersuchen, auf Grund dessen Gewand und Weg, es zu verhindern.
Dank Shlublu für seine große Hilfe!!!
InformationsquelleAutor Rikki Tikki Tavi