Android décodeur->décoder retourné false pour Bitmap télécharger
J'ai commencé à avoir un
DEBUG/skia(xxxx): --- decoder->decode returned false
problème sur un quelques photos de profil de Facebook que j'utilise dans ImageViews. La plupart fonctionnent parfaitement, mais à chaque fois dans un certain temps, je découvre une qui ne fonctionne jamais.
Je suis compiler mon application avec Android 1.6 pour des raisons de compatibilité descendante.
J'ai fait quelques recherches et a découvert un certain nombre de discussions sur la question. Je suis déjà à l'aide de la FlushedInputStream discuté ici: http://code.google.com/p/android/issues/detail?id=6066
Bitmap b = BitmapFactory.decodeStream(new FlushedInputStream(is));
imageView.setImageBitmap(b);
Voici un exemple qui me causer des ennuis:
http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs269.snc3/23132_639284607_390_q.jpg
Quelqu'un peut vérifier l'image et de m'aider à comprendre ce qui est à l'origine du problème?
Vous devez vous connecter pour publier un commentaire.
Il y a un bug dans FlushedInputStream(est). il échoue sur les connexions lentes, mais vous pouvez essayer mon code magique pour le fixer.
créer une classe statique à l'extérieur de votre méthode
et là, vous allez.. maintenant, vous n'aurez pas de problème.
Ici est un moyen qui a fonctionné pour moi:
Le code source de ce ImageDownloader.java est une bonne orientation. Il a une correction de bug qui traite de la Question 6066 en fournissant une version patchée de
FlushedInputStream
classe.Une autre chose que vous voudrez peut-être prendre soin de, est d'exécuter la fonction de décodage dans le même fil que la requête HTTP a été exécuté:
J'avais fait le décodage dans le
onPostExecute()
, qui est exécuté dans le thread de l'INTERFACE utilisateur, et il ne serait pas plus travailler, ce qui me donne le même message d'erreur.Ici est un moyen qui a fonctionné pour moi:
J'ai chargé l'image par le multithreading, et puis j'ai eu de la boucle de lecture de l'inputStream quand le fil du temps a été occupé par un autre. Assurez-vous que l'inputStream est lu entièrement.
Voici ce que la question est pour moi:
À partir de l'émulateur, je voudrais enregistrer le fichier jpg en local (sur le émulé sdcard) et puis de tenter de les lire et de les afficher à l'aide de décoder sur l'émulateur et cela a fonctionné. Puis, comme un test, j'ai copié le fichier (à l'aide de la bad pull) à mon développement (xp) de la machine et de l'afficher à l'aide de "peindre". Puis, à partir de l'émulateur, j'ai téléchargé le fichier (via http post) pour mon win2003 server. À l'aide de "peindre" il apparaît ainsi. Mais quand j'ai téléchargé de nouveau à l'émulateur (via http get), il a échoué lors de la décoder.
Puis j'ai remarqué que le fichier téléchargé vers le win2003 server a été deux octets plus petit que l'original. Pas totalement sûr de savoir comment c'est arrivé parce que j'ai été en utilisant la même logique de téléchargement pendant des années et jamais remarqué le problème avant. Comme un test, j'ai simplement ajouté plus de deux octets aléatoires lors de l'upload de sorte que la taille de fichier est exactement le même. Puis, une fois téléchargés à l'arrière de l'émulateur, il décodé et affiché correctement.
Viens de vérifier, j'ai ajouté deux octets aléatoires plus sur mes projets xcode et puis ces fichiers jpg également affiché sur l'émulateur android ainsi.
Ainsi, bien que les fichiers qui ont été deux octets de petites affichées partout ailleurs, ils ne seraient pas sur l'émulateur. Apparemment décoder est en train de faire une sorte de CRC avant qu'il tente de décoder et décide qu'elle ne peut pas continuer. Et d'où l'erreur.
D'autres personnes qui font face à des problèmes dans Android KitKat 4.4 , la suite serait utile
J'ai été confronté à ce problème dans le Nexus de la série Après la mise à jour vers 4.4.
Je suis tombé sur cette question à l'aide de Xamarin. Pour le fixer, j'ai simplement utilisé le Image Universelle De Chargeur De Xamarin Composant et cela a fonctionné comme un charme.
Espérons que cette aide!