BitmapFactory.decodeStream retourne null sans exception
-
08-10-2019 - |
Question
J'essaie de charger une image distante d'un serveur et grâce à un grand nombre d'exemples de code sur stackoverflow j'ai une solution qui fonctionne dans 2 des 3 images. Je ne sais pas vraiment quel est le problème avec la troisième image et parfois, quand laissant tourner le code dans le débogueur l'image est en cours de chargement. Aussi, si je charge l'image de problème d'abord les deux autres images sont parfois chargées.
Voici le code:
public static Drawable getPictureFromURL(Context ctx, String url, final int REQUIRED_SIZE) throws NullPointerException {
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
int scale = 1;
if (o.outWidth > REQUIRED_SIZE) {
scale = (int) Math.pow(2, (int) Math.round(Math.log(REQUIRED_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
}
Log.i(Prototype.TAG, "scale: "+scale);
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap bmp;
try {
bmp = BitmapFactory.decodeStream((InputStream) Tools.fetch(url), null, o2);
if(bmp!=null)
return new BitmapDrawable(ctx.getResources(), bmp);
else
return null;
} catch (Exception e) {
Log.e(Prototype.TAG, "Exception while decoding stream", e);
return null;
}
}
Au cours de débogage j'ai découvert que o.outWidth est -1, ce qui indique une erreur, mais aucune exception est levée, donc je ne peux pas vraiment dire ce qui a mal tourné. Le InputStream retourne toujours une valeur valide, et je sais que l'image existe sur le serveur.
Meilleurs voeux, Daniel
La solution
Je trouve la réponse ici et mis à jour la méthode de récupération à:
private static InputStream fetch(String address) throws MalformedURLException,IOException {
HttpGet httpRequest = new HttpGet(URI.create(address) );
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
return instream;
}