IllegalArgumentException Base64到图像解码android

Rik*_*avi 2 base64 android decode bitmap illegalargumentexception

我想解码从base64到webmap的webservice中的图像,并在我的Android应用程序中使用它.这是我的方法:

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;

    }
Run Code Online (Sandbox Code Playgroud)

如果我使用我的php脚本解码我从getCaptcha方法获得的字符串 - 它会正确显示.但是当我在我的应用程序中执行此操作时,我得到了一个

 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
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

我添加了base64代码:

/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
Run Code Online (Sandbox Code Playgroud)

问题是,当我从浏览器复制代码并将其硬编码到我的程序时 - 一切正常.但是当我通过我的android程序获取base64数据并尝试硬编码base64时 - 我得到一个例外.代码,在浏览器中,我通过Android得到的看起来是一样的.但是,实际上,它并不是因为不同的结果)

小智 7

实际上有一个简单的解决方案,它将删除有效的base64字符串后的任何错误数据:

String[] safe = received.split("=");
//put all chars before first base64 '=' padding char into safe[0]

try {
     byte[] recvpicbyte = Base64.decode(safe[0], Base64.NO_PADDING);
     //decode safe [0], note not in 'DEFUALT', use 'NO_PADDING' so it wont expect the '='

     //...do whatever with output
Run Code Online (Sandbox Code Playgroud)