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

1voto

Daryn Points 204

Essayez ceci :

AQuery aq = new AQuery(getActivity());
            aq.id(view.findViewById(R.id.image)).image(imageUrl, true, true, 0,  0,
                    new BitmapAjaxCallback() {
                        @Override
                        public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status){
                            iv.setImageBitmap(bm);
                        }
                    }.header("User-Agent", "android"));

1voto

Glide.with(context)
    .load("http://test.com/yourimage.jpg")  
    .asBitmap()  // convert it to the desired format
    .fitCenter()
    .into(new SimpleTarget(100,100) {
          @Override
          public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {

           // faites quelque chose avec votre image 

                bitmap

          }
    });

1voto

Kunal Parte Points 115
public static Bitmap getImgBitmapFromUri(final String url, final Activity context, final CropImageView imageView, final File file) {
    final Bitmap bitmap = null;
    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try {
                Utils.image = Glide.with(context)
                        .load(url).asBitmap()
                        .into(100, 100).get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            context.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (imageView != null)
                        imageView.setImageBitmap(Utils.image);
                }
            });
        }
    });
    return Utils.image;
}

Utilisez la bibliothèque Glide et exécutez le code suivant dans un fil de travail comme indiqué

1voto

Pratibha Sarode Points 1012
  private class AsyncTaskRunner extends AsyncTask {
    String Imageurl;

    public AsyncTaskRunner(String Imageurl) {
        this.Imageurl = Imageurl;
    }

    @Override
    protected String doInBackground(String... strings) {

        try {

            URL url = new URL(Imageurl);
            thumbnail_r = BitmapFactory.decodeStream(url.openConnection().getInputStream());

        } catch (IOException e) {
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        imgDummy.setImageBitmap(thumbnail_r);
        UtilityMethods.tuchOn(relProgress);
    }
}

Appeler asynctask comme suit :

 AsyncTaskRunner asyncTaskRunner = new AsyncTaskRunner(uploadsModel.getImages());
        asyncTaskRunner.execute();

0voto

Nick Unuchek Points 139

Très vite, cette méthode fonctionne très rapidement :

private Bitmap getBitmap(String url) 
    {
        File f=fileCache.getFile(url);

        //à partir du cache SD
        Bitmap b = decodeFile(f);
        if(b!=null)
            return b;

        //du web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex){
           ex.printStackTrace();
           return null;
        }
    }

    //décoder l'image et la redimensionner pour réduire la consommation de mémoire
    private Bitmap decodeFile(File f){
        try {
            //décoder la taille de l'image
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);

            //Trouver la valeur de mise à l'échelle correcte. Elle doit être une puissance de 2.
            final int REQUIRED_SIZE=70;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2

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