I want to decode an image from webservice which is in base64 to the bitmap and use it in my android app.
This is my method:
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;
}
If I decode the string which I get from getCaptcha method with my php script – it displays correctly. But when I do this in my application, I get an
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
What’s is reason of it?
I add base64 code that I get:
/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 is that when I copy the code from the browser and hardcode it to my program – everything works fine. But when I get the base64 data via my android program and try to hardcode the base64 – I get an exception. Code, which is in browser and what I get via Android looks the same. But, practically, it doesn’t because of different result)
It looks like the padding of your Base64 code is not good (wrong number of trailing
=signs at the end of your code). For example, the base64 code corresponding toHelloisSGVsbG8=, and the last=is just there to make the size of the base64 data chunck compliant with the Base64 RFC. SoSGVsbG8==andSGVsbG8are both incorrect as the length of the chunckis not according to the base64 spec, even though they both mean
Helloif we stick to relevant characters (the “Base 64 Alphabet”).Some implementations are quite permissive about that. They just assume that a base64 chunck of an incorrect length needs padding with one or two “=”. Some other, including Android, are not permissive, so the kind of discrepancy you are facing between the behaviours of your PHP and Android programs.
This is only an assumption, as I cannot see the base64 data you are trying to decode. To check that, you can use this online base64 decoder, which will tell you whether the padding is ok.
Anyhow it would be easier with a sample of your base64 code. Would you add that to your post? I’ll update my answer accordingly.