IllegalArgumentException Base64 pour le décodage des images android
Je veux décoder une image à partir d'un webservice qui est en base64 à l'image et l'utiliser dans mon application android.
C'est ma méthode:
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;
}
Si je décoder la chaîne qui je reçois de getCaptcha méthode avec mon script php - qu'il s'affiche correctement. Mais quand je fais cela dans mon application, j'obtiens une
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
Quelle est la raison de cela?
- Je ajouter base64 code que j'obtiens:
/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
Problème est que quand je copie le code dans le navigateur et de les coder en dur à mon programme - tout fonctionne bien. Mais quand je reçois le base64 données via mon android programme et d'essayer de coder en dur le base64, j'obtiens une exception. Le Code, qui est dans le navigateur et ce que je reçois via Android semble le même. Mais, pratiquement, il n'est pas à cause du résultat différent)
OriginalL'auteur Rikki Tikki Tavi | 2012-08-09
Vous devez vous connecter pour publier un commentaire.
Il ressemble le rembourrage de votre Base64 code n'est pas bon (mauvais numéro de fuite
=
signes à la fin de votre code). Par exemple, le base64 code correspondant àHello
estSGVsbG8=
, et le dernier=
est juste là pour faire de la taille de la base64 données chunck conforme à la Base64 RFC. DoncSGVsbG8==
etSGVsbG8
sont à la fois erronée, comme la longueur de la chunckn'est pas selon le base64 spec, même si les deux veulent dire
Hello
si nous nous en tenons à des caractères pertinents (la "Base 64 Alphabet").Certaines implémentations sont assez permissif à ce sujet. Ils pensent que base64 chunck d'une longueur incorrecte besoins de remplissage avec un ou deux "=". Certains autres, y compris Android, ne sont pas permissives, donc le genre de divergence, vous êtes face à entre les comportements de votre PHP et Android programmes.
Ce n'est qu'une hypothèse, je ne vois pas le base64 données que vous essayez de décoder. Pour vérifier cela, vous pouvez utiliser cette ligne base64 decoder, qui vous dira si le rembourrage est ok.
De toute façon, il serait plus facile avec un échantillon de votre code base64. Souhaitez-vous ajouter à votre poste? Je vais mettre à jour ma réponse en conséquence.
Il y a un
n
après la fuite=
à la fin de votre code. Cela rend les données base64 chunck invalide. Une fois supprimé, le reste est valide, j'ai pu décoder sans problème. Peut-être que le problème vient de votre service. Il semble un\n
caractère de fin de ligne a été mal orthographié à tortn
dans le code de service.EEEEEEEEEEEEEE!!!!!merci beaucoup!!!!!!comment pourriez-vous vous identifier??? Je me demande - quelle est la raison de cela? service web envoyer les données correctement, car il affiche correctement dans le navigateur...pourquoi ce "n" appeat à mon côté client? J'ai envoyer la demande et devrait recevoir les mêmes données...mais ce n'est pas...très bizarre...merci beaucoup...
Vous êtes les bienvenus 🙂 Peut-être que l'erreur est dans votre client Android, qui tente d'ajouter un
\n
aux données qu'il lit. De toute façon, je suis juste deviner, mais laissez-moi savoir 🙂le problème n'est pas dans les \n, mais seulement en n...Client ajoute n comme un dernier symbole...sauf à partir de la chaîne de données à partir du webservice résolu le problème. Je vous remercie.
OriginalL'auteur Shlublu
En fait il existe une solution simple à ce qui va supprimer toutes les données de mauvaise qualité après un valide base64 chaîne:
OriginalL'auteur RoninSeito
Le problème a été en ajoutant à la réponse JSON "n" caractères à la fin de la base64 de la chaîne de l'image. La raison de cela appereance est mystiquement. Intéressant de noter que d'autres réponse JSON à partir de ce webservice sans "n" caractères. J'ai essayé d'obtenir que la chaîne de l'image en base64 avec régulièrement des de code Java - tout était de bonne - sans "n" caractères. Donc, il appereance en raison de android côté client. Essayez d'enquêter sur la raison de son appereance et la façon de la prévenir.
Grâce à Shlublu pour sa grande aide!!!
OriginalL'auteur Rikki Tikki Tavi