web-dev-qa-db-ja.com

Picassoを使用して画像をダウンロードして保存する

カスタムListViewnewsを表示しようとしています。各newsはいくつかのimagesに含まれており、

1.サーバーからimagesをダウンロードします

2.ローカルストレージに保存する

3. path of imagesをSQLiteに保存する

4. show imagesカスタムアダプタを使用したListViewで。

ステップ12に問題があります。サーバーからnewsを取得し、ListViewで表示できます。

アダプターに以下のコードを追加して、キャッシュからimagesを表示します。

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

Picasso.with(context).load(image[position]).into(target)を使用することで、保存できます

imageストレージ内。

あなたのアイデアを教えてください...

[〜#〜] update [〜#〜]:以下のコードを使用すると、1つの画像(画像配列の最後のインデックス)だけが保存されます!

このコードですべての画像を配列に保存するにはどうすればよいですか?!

_@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

Picasso.with(this).load(image[i]).into(target);の呼び出しの前にTarget target定義を配置してください

追伸次のコードを使用して、画像を非常にうまく保存しました。とにかくありがとう。

私のコード:

        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

電話ギャラリーに写真を保存するためのカスタムターゲット。

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

この投稿は古いものですが、質問にはまだ回答されていないようです。コードを読むと、picassoへの呼び出しは非同期である可能性があります。それが事実であるかのように、あなたは間違いなくチェックする必要がありますimage.lengthタスク。新しいタスクごとにファイル名を変更し、すべてのタスクを完了して、設定された最後のファイル名に保存します。これを解決するには、onBitmapLoadedリスナーで、タスクの終了時に準備ができるように、Targetコンストラクターをオーバーライドし、ファイル名パラメーターを追加する必要があります。

1
Kristo