84 votes

Android charger à partir de l'URL vers Bitmap

J'ai une question concernant le chargement d'une image à partir d'un site web. Le code que j'utilise est :

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();
Bitmap bit=null;
try {
    bit = BitmapFactory.decodeStream((InputStream)new URL("http://www.mac-wallpapers.com/bulkupload/wallpapers/Apple%20Wallpapers/apple-black-logo-wallpaper.jpg").getContent());
} catch (Exception e) {}
Bitmap sc = Bitmap.createScaledBitmap(bit,width,height,true);
canvas.drawBitmap(sc,0,0,null);

Mais cela retourne toujours une exception de pointeur nul et le programme plante. L'URL est valide, et cela semble fonctionner pour tout le monde. Je suis en train d'utiliser la version 2.3.1.

1 votes

Quel message de crash obtenez-vous? Quelle est la trace de la pile? Savez-vous quelle ligne provoque le crash?

0 votes

La méthode createScalesBitmap lance une NullPointerException car bit est nul.

1 votes

Nécessaire l'autorisation Internet... Ajouté à androidmanifest.xml

183voto

silentnuke Points 2574
public static Bitmap getBitmapFromURL(String src) {
    try {
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        // Journaliser l'exception
        return null;
    }
}

6 votes

Comment charger un fichier depuis https ?

13 votes

Faites attention au blocage du thread principal. Cela doit être utilisé dans une classe dérivée d'AsyncTask.

18 votes

Le code est bon. Mais il y aura une exception de "Réseau sur le thread principal". Essayez d'utiliser ceci à l'intérieur de "Async Task".

38voto

Phan Van Linh Points 16963

Si vous utilisez Picasso ou Glide ou Universal-Image-Loader pour charger une image à partir d'une URL.
Vous pouvez simplement obtenir le bitmap chargé en

Pour Picasso (version actuelle 2.71828)

Code Java

Picasso.get().load(imageUrl).into(new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        // le bitmap chargé est ici (bitmap)
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) { }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {}
});

Code Kotlin

Picasso.get().load(url).into(object : com.squareup.picasso.Target { 
    override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
         // le bitmap chargé est ici (bitmap)
    }

    override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}

    override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {}
})

Pour Glide
Consultez Comment utilise-t-on Glide pour télécharger une image dans un bitmap?

Pour Universal-Image-Loader
Code Java

imageLoader.loadImage(imageUrl, new SimpleImageLoadingListener() 
{
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) 
    {
         // le bitmap chargé est ici (loadedImage)
    }
});

11voto

Dhruv Raval Points 4578

Je préfère celui-ci:

Crée Bitmap à partir d'un InputStream et le retourne:

public static Bitmap downloadImage(String url) {
        Bitmap bitmap = null;
        InputStream stream = null;
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;

        try {
            stream = getHttpConnection(url);
            bitmap = BitmapFactory.decodeStream(stream, null, bmOptions);
            stream.close();
        }
        catch (IOException e1) {
            e1.printStackTrace();
            System.out.println("downloadImage"+ e1.toString());
        }
        return bitmap;
    }

  // Fait la connexion HttpURLConnection et retourne InputStream

 public static InputStream getHttpConnection(String urlString)  throws IOException {

        InputStream stream = null;
        URL url = new URL(urlString);
        URLConnection connection = url.openConnection();

        try {
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            httpConnection.setRequestMethod("GET");
            httpConnection.connect();

            if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                stream = httpConnection.getInputStream();
            }
        }
        catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("downloadImage" + ex.toString());
        }
        return stream;
    }

SOUVENEZ-VOUS :

Android inclut deux clients HTTP: HttpURLConnection et Apache HTTP Client. Pour Gingerbread et ultérieur, HttpURLConnection est le meilleur choix.

À partir d'Android 3.x Honeycomb ou ultérieur, vous ne pouvez pas effectuer d' entrée/sortie réseau sur le thread UI et faire cela lance android.os.NetworkOnMainThreadException. Vous devez utiliser Asynctask à la place comme indiqué ci-dessous

/**     AsyncTAsk for Image Bitmap  */
    private class AsyncGettingBitmapFromUrl extends AsyncTask {

        @Override
        protected Bitmap doInBackground(String... params) {

            System.out.println("doInBackground");

            Bitmap bitmap = null;

            bitmap = AppMethods.downloadImage(params[0]);

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {

            System.out.println("bitmap" + bitmap);

        }
    }

6voto

northerngirl Points 131
public Drawable loadImageFromURL(String url, String name) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, name);
        return d;
    } catch (Exception e) {
        return null;
    }
}

6voto

Abdelrahman Tarek Points 500

Cette méthode fera l'affaire avec la coroutine kotlin afin de ne pas bloquer le thread principal de l'interface utilisateur et renverra une image bitmap de cercle redimensionnée (comme une image de profil).

 private var image: Bitmap? = null
 private fun getBitmapFromURL(src: String?) {
    CoroutineScope(Job() + Dispatchers.IO).launch {
        try {
            val url = URL(src)
            val bitMap = BitmapFactory.decodeStream(url.openConnection().getInputStream())
            image = Bitmap.createScaledBitmap(bitMap, 100, 100, true)
        } catch (e: IOException) {
            // Log exception
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X