web-dev-qa-db-fra.com

Téléchargez et enregistrez des images avec Picasso

J'essaie de montrer mon news dans un ListView personnalisé. Chaque news est inclus dans certains images et je souhaite 

1.download images du serveur

2. enregistrer dans le stockage local

3.enregistrez chemin de images dans SQLite

4.show images dans ListView en utilisant mon adaptateur personnalisé.

J'ai juste un problème avec les étapes 1 et 2. Je peux obtenir news du serveur et les afficher dans mon ListView 

et affichez images à partir du cache en ajoutant le code ci-dessous dans mon adaptateur:

Picasso.with(context).load(image[position]).into(iv);

En utilisant Picasso.with(context).load(image[position]).into(target), je peux juste en sauver un 

image en stockage.

Suggérez-moi votre idée.

UPDATE: lorsque j'utilise le code ci-dessous, une seule image (le dernier index de mon tableau d'images) est enregistrée!

Comment puis-je enregistrer toutes les images d'un tableau avec ce code?!

@Override
protected void onPostExecute(Void result) {
   SaveImages();
   pDialog.dismiss();
   super.onPostExecute(result);
}

String fileName = null;

public void SaveImages() {
    for(int i = 0; i < image.length; i++) {
        Picasso.with(this).load(image[i]).into(target);
        fileName = "image-" + i + ".jpg";
    }
}

Target target = new Target() {

    @Override
    public void onPrepareLoad(Drawable arg0) {
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) {
        File file = new File(Environment.getExternalStorageDirectory().getPath() +"/" + fileName);
         try {
             file.createNewFile();
             FileOutputStream ostream = new FileOutputStream(file);
             bitmap.compress(CompressFormat.JPEG, 75, ostream);
             ostream.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
    }

    @Override
    public void onBitmapFailed(Drawable arg0) {
    }
};
16
Farshad Kazemi

Essayez de mettre la définition "cible" avant "Picasso.with (this) .load (image [i]). Dans (cible);".

P.S. Ici, j'utilise ce code et enregistre bien les images. Merci quand même.

Mon code:

        final String fileName = mDataset.get(i).getAid() + ".jpg";
        Target target = new Target() {

            @Override
            public void onPrepareLoad(Drawable arg0) {
                return;
            }

            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) {

                try {
                    File file = null;

                    // judge "imgs/.nomedia"'s existance to judge whether path available
                    if(LightCache.testFileExist(GlobalConfig.getFirstStoragePath()
                            + "imgs" + File.separator +".nomedia") == true)
                        file = new File(GlobalConfig.getFirstStoragePath()
                                + "imgs" + File.separator + fileName);

                    else file = new File(GlobalConfig.getSecondStoragePath()
                            + "imgs" + File.separator + fileName);

                    file.createNewFile();
                    FileOutputStream ostream = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
                    ostream.close();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onBitmapFailed(Drawable arg0) {
                return;
            }
        };

        Picasso.with(GlobalConfig.getContext())
                .load(Wenku8API.getCoverURL(mDataset.get(i).getAid()))
                .into(target);
7
MewX

Cible personnalisée pour stocker des photos dans la galerie du téléphone.

public class TargetPhoneGallery implements Target
{
    private final WeakReference<ContentResolver> resolver;
    private final String name;
    private final String desc;

    public TargetPhoneGallery(ContentResolver r, String name, String desc)
    {
        this.resolver = new WeakReference<ContentResolver>(r);
        this.name = name;
        this.desc = desc;
    }

    @Override
    public void onPrepareLoad (Drawable arg0)
    {
    }

    @Override
    public void onBitmapLoaded (Bitmap bitmap, LoadedFrom arg1)
    {
        ContentResolver r = resolver.get();
        if (r != null)
        {
            MediaStore.Images.Media.insertImage(r, bitmap, name, desc);
        }
    }

    @Override
    public void onBitmapFailed (Drawable arg0)
    {
    }
}

Picasso.with(context).load(image[position]).into(new TargetPhoneGallery(view.getContentResolver(), "image name", "image desc"));
2
maros136

bien que ce message soit ancien, il semble que la question n’ait pas encore été posée . En lisant votre code, il semblerait que l’appel que vous avez fait à Picasso soit asynchrone . Vous devez absolument le vérifier, comme si c’était le Dans ce cas, vous démarrez des tâches image.length, en modifiant le nom de fichier à chaque nouvelle tâche, en menant toutes les tâches à terme et en enregistrant le dernier nom de fichier défini . Pour résoudre ce problème, vous devez remplacer le constructeur Target et ajouter un paramètre filename afin prêt lorsque la tâche se termine, dans votre auditeur onBitmapLoaded.

1
Kristo