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

0voto

Surendar D Points 2927

Veuillez essayer les étapes suivantes.

1) Créez AsyncTask dans la classe ou l'adaptateur (si vous souhaitez changer l'image de l'élément de la liste).

public class AsyncTaskLoadImage extends AsyncTask {
        private final static String TAG = "AsyncTaskLoadImage";
        private ImageView imageView;

        public AsyncTaskLoadImage(ImageView imageView) {
            this.imageView = imageView;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            try {
                URL url = new URL(params[0]);
                bitmap = BitmapFactory.decodeStream((InputStream) url.getContent());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            try {
                int width, height;
                height = bitmap.getHeight();
                width = bitmap.getWidth();

                Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                Canvas c = new Canvas(bmpGrayscale);
                Paint paint = new Paint();
                ColorMatrix cm = new ColorMatrix();
                cm.setSaturation(0);
                ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
                paint.setColorFilter(f);
                c.drawBitmap(bitmap, 0, 0, paint);
                imageView.setImageBitmap(bmpGrayscale);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

2) Appelez AsyncTask depuis votre activité, fragment ou adaptateur (à l'intérieur de onBindViewHolder).

2.a) Pour l'adaptateur:

    String src = current.getProductImage();
    new AsyncTaskLoadImage(holder.icon).execute(src);

2.b) Pour l'activité et le fragment:

**Activité:**
  ImageView imagview= (ImageView) findViewById(R.Id.imageview);
  String src = (votre chaîne d'image);
  new AsyncTaskLoadImage(imagview).execute(src);

**Fragment:**
  ImageView imagview= (ImageView)view.findViewById(R.Id.imageview);
  String src = (votre chaîne d'image);
  new AsyncTaskLoadImage(imagview).execute(src);

3) Veuillez exécuter l'application et vérifier l'image.

Bon codage.... :)

0voto

Manish Dodiya Points 25

Si vous chargez une URL à partir d'un bitmap sans utiliser AsyncTask, écrivez deux lignes après setContentView(R.layout.abc);

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

try {
    URL url = new URL("http://....");
    Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
} catch(IOException e) {
    System.out.println(e);
}

0voto

Faakhir Points 346

Si vous utilisez Picasso pour les images, vous pouvez essayer la méthode ci-dessous!

public static Bitmap getImageBitmapFromURL(Context context, String imageUrl){
    Bitmap imageBitmap = null;
    try {
      imageBitmap = new AsyncTask() {
        @Override
        protected Bitmap doInBackground(Void... params) {
          try {
            int targetHeight = 200;
            int targetWidth = 200;

            return Picasso.with(context).load(String.valueOf(imageUrl))
              //.resize(targetWidth, targetHeight)
              .placeholder(R.drawable.raw_image)
              .error(R.drawable.raw_error_image)
              .get();
          } catch (IOException e) {
            e.printStackTrace();
          }
          return null;
        }
      }.execute().get();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } 
  return imageBitmap;
  }

0voto

KishanSolanki124 Points 966

Si vous utilisez Glide et Kotlin,

Glide.with(this)
            .asBitmap()
            .load("https://...")
            .addListener(object : RequestListener {
                override fun onLoadFailed(
                    e: GlideException?,
                    model: Any?,
                    target: Target?,
                    isFirstResource: Boolean
                ): Boolean {
                    Toast.makeText(this@MainActivity, "échec : " + e?.printStackTrace(), Toast.LENGTH_SHORT).show()
                    return false
                }

                override fun onResourceReady(
                    resource: Bitmap?,
                    model: Any?,
                    target: Target?,
                    dataSource: DataSource?,
                    isFirstResource: Boolean
                ): Boolean {
                    //l'image est prête, vous pouvez obtenir le bitmap ici
                    var bitmap = resource
                    return false
                }

            })
            .into(imageView)

0voto

Exel Staderlin Points 158
fun getBitmap(url : String?) : Bitmap? {
    var bmp : Bitmap ? = null
    Picasso.get().load(url).into(object : com.squareup.picasso.Target {
        override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
            bmp =  bitmap
        }

        override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}

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

Essayez ceci avec picasso

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