95

Androidで特定のURLから画像をダウンロードして保存するにはどうすればよいですか?

4

11 に答える 11

229

2015 年 12 月 30 日時点で編集 - 画像ダウンロードの究極のガイド


最後のメジャー アップデート: 2016 年 3 月 31 日


TL;DR別名の話はやめて、コードを教えてください!!

BasicImageDownloaderこの投稿の最後までスキップし、 (javadoc バージョンはこちら) をプロジェクトにコピーし、インターフェースを実装OnImageLoaderListenerすれば完了です。

:BasicImageDownloaderは考えられるエラーを処理し、問題が発生した場合にアプリがクラッシュするのを防ぎますが、ダウンロードしBitmapsた .


この投稿は非常に多くの注目を集めたので、人々が非推奨のテクノロジーや悪いプログラミング プラクティスを使用したり、メイン スレッドでネットワークを実行するための「ハック」を探したり、またはすべての SSL 証明書を受け入れます。

「Image Downloader」という名前のデモ プロジェクトを作成しました。これは、独自のダウンローダー実装、Android の組み込みDownloadManagerライブラリ、およびいくつかの一般的なオープンソース ライブラリを使用して画像をダウンロード (および保存) する方法を示しています。完全なソース コードを表示するか、GitHub でプロジェクトをダウンロードできます。

: SDK 23+ (Marshmallow) の権限管理はまだ調整していないため、プロジェクトは SDK 22 (Lollipop) を対象としています。

この投稿の最後にある私の結論として、私が言及した画像ダウンロードのそれぞれの特定の方法の適切な使用例について、私の謙虚な意見を共有します.

独自の実装から始めましょう (コードは記事の最後にあります)。まず第一に、これは基本的な ImageDownloader であり、それだけです。指定された URL に接続し、データを読み取り、それを としてデコードして、必要に応じてインターフェイス コールバックBitmapをトリガーするだけです。OnImageLoaderListenerこのアプローチの利点 - シンプルで、何が起こっているのかを明確に把握できます。メモリ/ディスクキャッシュの維持を気にせずに、いくつかの画像をダウンロード/表示および保存するだけでよい場合は、良い方法です。

注: 画像が大きい場合は、縮小する必要がある場合があります。

--

Android DownloadManagerは、システムにダウンロードを処理させる方法です。実際には、画像だけでなく、あらゆる種類のファイルをダウンロードできます。ダウンロードを黙って実行し、ユーザーには見えないようにすることも、ユーザーが通知領域でダウンロードを確認できるようにすることもできます。を登録して、BroadcastReceiverダウンロードの完了後に通知を受け取ることもできます。セットアップは非常に簡単です。サンプル コードについては、リンクされたプロジェクトを参照してください。

DownloadManagerダウンロードBitmapしたをImageView. またDownloadManager、アプリがダウンロードの進行状況を追跡するための API も提供していません。

--

さて、素晴らしいもの、ライブラリの紹介です。画像をダウンロードして表示するだけでなく、メモリ/ディスク キャッシュの作成と管理、画像のサイズ変更、変換などを行うことができます。

まず、Google によって作成され、公式ドキュメントでカバーされている強力なライブラリであるVolleyから始めます。Volley は画像に特化していない汎用ネットワーク ライブラリですが、画像を管理するための非常に強力な API を備えています。

Volley リクエストを管理するためにSingletonクラスを実装する必要があります。

ImageViewyourを Volley のに置き換えるNetworkImageViewと、ダウンロードは基本的にワンライナーになります。

((NetworkImageView) findViewById(R.id.myNIV)).setImageUrl(url, MySingleton.getInstance(this).getImageLoader());

さらに制御が必要な場合はImageRequest、Volley を使用して を作成すると次のようになります。

     ImageRequest imgRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
             @Override
             public void onResponse(Bitmap response) {
                    //do stuff
                }
            }, 0, 0, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888, 
             new Response.ErrorListener() {
             @Override
             public void onErrorResponse(VolleyError error) {
                   //do stuff
                }
            });

Volley は、エラーVolleyErrorの正確な原因を特定するのに役立つクラスを提供することにより、優れたエラー処理メカニズムを備えていることに注意してください。アプリが多くのネットワーキングを行い、画像の管理が主な目的ではない場合、Volley は最適です。

--

Square のPicassoは有名なライブラリで、画像の読み込みをすべて行ってくれます。Picasso を使用して画像を表示するのは、次のように簡単です。

 Picasso.with(myContext)
       .load(url)
       .into(myImageView); 

デフォルトでは、Picasso がディスク/メモリ キャッシュを管理するので、心配する必要はありません。さらに制御するには、インターフェースを実装し、Targetそれを使用して画像をロードします。これにより、Volley の例と同様のコールバックが提供されます。例については、デモ プロジェクトを確認してください。

Picasso では、ダウンロードした画像に変換を適用することもできます。これらの API を拡張するライブラリは他にもあります。RecyclerView/ ListView/でも非常にうまく機能しGridViewます。

--

Universal Image Loaderは、イメージ管理の目的で使用されるもう 1 つの非常に人気のあるライブラリです。ImageLoader1 行のコードで画像をダウンロードするために使用できるグローバル インスタンスを持つ (初期化されると)独自のものを使用します。

  ImageLoader.getInstance().displayImage(url, myImageView);

ダウンロードの進行状況を追跡したり、ダウンロードしたファイルにアクセスしたい場合Bitmap:

 ImageLoader.getInstance().displayImage(url, myImageView, opts, 
 new ImageLoadingListener() {
     @Override
     public void onLoadingStarted(String imageUri, View view) {
                     //do stuff
                }

      @Override
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                   //do stuff
                }

      @Override
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                   //do stuff
                }

      @Override
      public void onLoadingCancelled(String imageUri, View view) {
                   //do stuff
                }
            }, new ImageLoadingProgressListener() {
      @Override
      public void onProgressUpdate(String imageUri, View view, int current, int total) {
                   //do stuff
                }
            });

この例のopts引数はDisplayImageOptionsオブジェクトです。詳細については、デモ プロジェクトを参照してください。

Volley と同様に、UIL は、FailReasonダウンロードの失敗時に何が問題だったかを確認できるクラスを提供します。デフォルトでは、明示的にそうしないように指示しない限り、UIL はメモリ/ディスク キャッシュを維持します。

: 著者は、2015 年 11 月 27 日の時点でプロジェクトを維持していないと述べています。しかし、多くの貢献者がいるので、ユニバーサル イメージ ローダーが存続することを期待できます。

--

Facebook のFrescoは最新かつ (IMO) 最先端のライブラリであり、イメージ管理を新しいレベルに引き上げますBitmaps。Java ヒープを使わない (Lollipop より前) から、アニメーション形式プログレッシブ JPEG ストリーミングをサポートするまでです。

Fresco の背後にあるアイデアとテクニックの詳細については、この投稿を参照してください。

基本的な使い方は至ってシンプル。Fresco.initialize(Context);呼び出す必要があるのは 1 回だけであることに注意してください Application。Fresco を複数回初期化すると、予期しない動作や OOM エラーが発生する可能性があります。

Fresco は を使用Draweeして画像を表示します。それらは のように考えることができますImageView

    <com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/drawee"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    fresco:fadeDuration="500"
    fresco:actualImageScaleType="centerCrop"
    fresco:placeholderImage="@drawable/placeholder_grey"
    fresco:failureImage="@drawable/error_orange"
    fresco:placeholderImageScaleType="fitCenter"
    fresco:failureImageScaleType="centerInside"
    fresco:retryImageScaleType="centerCrop"
    fresco:progressBarImageScaleType="centerInside"
    fresco:progressBarAutoRotateInterval="1000"
    fresco:roundAsCircle="false" />

ご覧のとおり、多くのもの (変換オプションを含む) が既に XML で定義されているため、画像を表示するために必要なことは次の 1 行だけです。

 mDrawee.setImageURI(Uri.parse(url));

Fresco が提供する拡張カスタマイズ API は、状況によっては非常に複雑になる可能性があり、ユーザーはドキュメントを注意深く読む必要があります (そうです、 RTFMが必要になる場合もあります)。

サンプル プロジェクトには、プログレッシブ JPEG とアニメーション イメージの例が含まれています。


結論 - 「私は素晴らしいものについて学びました。今何を使うべきですか?」

以下の文章は私の個人的な意見を反映したものであり、仮説として解釈されるべきではないことに注意してください。

  • 一部の画像のみをダウンロード/保存/表示する必要があり、それらを使用する予定がなく、Recycler-/Grid-/ListView表示用に大量の画像を必要としない場合は、BasicImageDownloaderがニーズに合っているはずです。
  • ユーザーまたは自動アクションの結果としてアプリが画像 (またはその他のファイル) を保存し、画像を頻繁に表示する必要がない場合は、Android DownloadManagerを使用します。
  • アプリが多くのネットワーキングを行い、JSONデータを送受信し、画像を操作するが、それらがアプリの主な目的ではない場合は、Volleyを使用してください。
  • あなたのアプリは画像/メディアに焦点を当てており、画像にいくつかの変換を適用したいが、複雑な API に煩わされたくない: Picasso (注: 中間のダウンロード ステータスを追跡するための API を提供していません) またはUniversal Imageを使用します。ローダ
  • アプリがすべて画像に関するもので、アニメーション形式の表示などの高度な機能が必要で、ドキュメントを読む準備ができている場合は、Frescoを使用してください。

見逃した場合は、デモ プロジェクトのGithub リンクを参照してください。


そして、これがBasicImageDownloader.java

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Set;

public class BasicImageDownloader {

    private OnImageLoaderListener mImageLoaderListener;
    private Set<String> mUrlsInProgress = new HashSet<>();
    private final String TAG = this.getClass().getSimpleName();

    public BasicImageDownloader(@NonNull OnImageLoaderListener listener) {
        this.mImageLoaderListener = listener;
    }

    public interface OnImageLoaderListener {
        void onError(ImageError error);      
        void onProgressChange(int percent);
        void onComplete(Bitmap result);
    }


    public void download(@NonNull final String imageUrl, final boolean displayProgress) {
        if (mUrlsInProgress.contains(imageUrl)) {
            Log.w(TAG, "a download for this url is already running, " +
                    "no further download will be started");
            return;
        }

        new AsyncTask<Void, Integer, Bitmap>() {

            private ImageError error;

            @Override
            protected void onPreExecute() {
                mUrlsInProgress.add(imageUrl);
                Log.d(TAG, "starting download");
            }

            @Override
            protected void onCancelled() {
                mUrlsInProgress.remove(imageUrl);
                mImageLoaderListener.onError(error);
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                mImageLoaderListener.onProgressChange(values[0]);
            }

        @Override
        protected Bitmap doInBackground(Void... params) {
            Bitmap bitmap = null;
            HttpURLConnection connection = null;
            InputStream is = null;
            ByteArrayOutputStream out = null;
            try {
                connection = (HttpURLConnection) new URL(imageUrl).openConnection();
                if (displayProgress) {
                    connection.connect();
                    final int length = connection.getContentLength();
                    if (length <= 0) {
                        error = new ImageError("Invalid content length. The URL is probably not pointing to a file")
                                .setErrorCode(ImageError.ERROR_INVALID_FILE);
                        this.cancel(true);
                    }
                    is = new BufferedInputStream(connection.getInputStream(), 8192);
                    out = new ByteArrayOutputStream();
                    byte bytes[] = new byte[8192];
                    int count;
                    long read = 0;
                    while ((count = is.read(bytes)) != -1) {
                        read += count;
                        out.write(bytes, 0, count);
                        publishProgress((int) ((read * 100) / length));
                    }
                    bitmap = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());
                } else {
                    is = connection.getInputStream();
                    bitmap = BitmapFactory.decodeStream(is);
                }
            } catch (Throwable e) {
                if (!this.isCancelled()) {
                    error = new ImageError(e).setErrorCode(ImageError.ERROR_GENERAL_EXCEPTION);
                    this.cancel(true);
                }
            } finally {
                try {
                    if (connection != null)
                        connection.disconnect();
                    if (out != null) {
                        out.flush();
                        out.close();
                    }
                    if (is != null)
                        is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return bitmap;
        }

            @Override
            protected void onPostExecute(Bitmap result) {
                if (result == null) {
                    Log.e(TAG, "factory returned a null result");
                    mImageLoaderListener.onError(new ImageError("downloaded file could not be decoded as bitmap")
                            .setErrorCode(ImageError.ERROR_DECODE_FAILED));
                } else {
                    Log.d(TAG, "download complete, " + result.getByteCount() +
                            " bytes transferred");
                    mImageLoaderListener.onComplete(result);
                }
                mUrlsInProgress.remove(imageUrl);
                System.gc();
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

    public interface OnBitmapSaveListener {
        void onBitmapSaved();
        void onBitmapSaveError(ImageError error);
    }


    public static void writeToDisk(@NonNull final File imageFile, @NonNull final Bitmap image,
                               @NonNull final OnBitmapSaveListener listener,
                               @NonNull final Bitmap.CompressFormat format, boolean shouldOverwrite) {

    if (imageFile.isDirectory()) {
        listener.onBitmapSaveError(new ImageError("the specified path points to a directory, " +
                "should be a file").setErrorCode(ImageError.ERROR_IS_DIRECTORY));
        return;
    }

    if (imageFile.exists()) {
        if (!shouldOverwrite) {
            listener.onBitmapSaveError(new ImageError("file already exists, " +
                    "write operation cancelled").setErrorCode(ImageError.ERROR_FILE_EXISTS));
            return;
        } else if (!imageFile.delete()) {
            listener.onBitmapSaveError(new ImageError("could not delete existing file, " +
                    "most likely the write permission was denied")
                    .setErrorCode(ImageError.ERROR_PERMISSION_DENIED));
            return;
        }
    }

    File parent = imageFile.getParentFile();
    if (!parent.exists() && !parent.mkdirs()) {
        listener.onBitmapSaveError(new ImageError("could not create parent directory")
                .setErrorCode(ImageError.ERROR_PERMISSION_DENIED));
        return;
    }

    try {
        if (!imageFile.createNewFile()) {
            listener.onBitmapSaveError(new ImageError("could not create file")
                    .setErrorCode(ImageError.ERROR_PERMISSION_DENIED));
            return;
        }
    } catch (IOException e) {
        listener.onBitmapSaveError(new ImageError(e).setErrorCode(ImageError.ERROR_GENERAL_EXCEPTION));
        return;
    }

    new AsyncTask<Void, Void, Void>() {

        private ImageError error;

        @Override
        protected Void doInBackground(Void... params) {
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(imageFile);
                image.compress(format, 100, fos);
            } catch (IOException e) {
                error = new ImageError(e).setErrorCode(ImageError.ERROR_GENERAL_EXCEPTION);
                this.cancel(true);
            } finally {
                if (fos != null) {
                    try {
                        fos.flush();
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        @Override
        protected void onCancelled() {
            listener.onBitmapSaveError(error);
        }

        @Override
        protected void onPostExecute(Void result) {
            listener.onBitmapSaved();
        }
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  }

public static Bitmap readFromDisk(@NonNull File imageFile) {
    if (!imageFile.exists() || imageFile.isDirectory()) return null;
    return BitmapFactory.decodeFile(imageFile.getAbsolutePath());
}

public interface OnImageReadListener {
    void onImageRead(Bitmap bitmap);
    void onReadFailed();
}

public static void readFromDiskAsync(@NonNull File imageFile, @NonNull final OnImageReadListener listener) {
    new AsyncTask<String, Void, Bitmap>() {
        @Override
        protected Bitmap doInBackground(String... params) {
            return BitmapFactory.decodeFile(params[0]);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (bitmap != null)
                listener.onImageRead(bitmap);
            else
                listener.onReadFailed();
        }
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, imageFile.getAbsolutePath());
}

    public static final class ImageError extends Throwable {

        private int errorCode;
        public static final int ERROR_GENERAL_EXCEPTION = -1;
        public static final int ERROR_INVALID_FILE = 0;
        public static final int ERROR_DECODE_FAILED = 1;
        public static final int ERROR_FILE_EXISTS = 2;
        public static final int ERROR_PERMISSION_DENIED = 3;
        public static final int ERROR_IS_DIRECTORY = 4;


        public ImageError(@NonNull String message) {
            super(message);
        }

        public ImageError(@NonNull Throwable error) {
            super(error.getMessage(), error.getCause());
            this.setStackTrace(error.getStackTrace());
        }

        public ImageError setErrorCode(int code) {
            this.errorCode = code;
            return this;
        }

        public int getErrorCode() {
            return errorCode;
        }
      }
   }
于 2013-03-21T14:00:01.787 に答える
35

この問題を解決したばかりで、ダウンロードしてSDカードに保存し(ファイル名を非表示にして)、画像を取得し、最後に画像が存在するかどうかを確認する完全なコードを共有したいと思います。URL はデータベースから取得されるため、ID を使用してファイル名を簡単に一意にすることができます。

まず、画像をダウンロードするためのクラスを作成します。

private class GetImages extends AsyncTask<Object, Object, Object> {
    private String requestUrl, imagename_;
    private ImageView view;
    private Bitmap bitmap;
    private FileOutputStream fos;

    private GetImages(String requestUrl, ImageView view, String _imagename_) {
        this.requestUrl = requestUrl;
        this.view = view;
        this.imagename_ = _imagename_;
    }

    @Override
    protected Object doInBackground(Object... objects) {
        try {
            URL url = new URL(requestUrl);
            URLConnection conn = url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
        } catch (Exception ex) {
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        if (!ImageStorage.checkifImageExists(imagename_)) {
            view.setImageBitmap(bitmap);
            ImageStorage.saveToSdCard(bitmap, imagename_);
        }
    }
}

次に、ファイルを保存および取得するためのクラスを作成します。

public class ImageStorage {
    public static String saveToSdCard(Bitmap bitmap, String filename) {

        String stored = null;
        File sdcard = Environment.getExternalStorageDirectory();

        File folder = new File(sdcard.getAbsoluteFile(), ".your_specific_directory");//the dot makes this directory hidden to the user
        folder.mkdir();
        File file = new File(folder.getAbsoluteFile(), filename + ".jpg");
        if (file.exists())
            return stored;

        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
            stored = "success";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stored;
    }

    public static File getImage(String imagename) {
        File mediaImage = null;
        try {
            String root = Environment.getExternalStorageDirectory().toString();
            File myDir = new File(root);
            if (!myDir.exists())
                return null;

            mediaImage = new File(myDir.getPath() + "/.your_specific_directory/" + imagename);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return mediaImage;
    }

    public static boolean checkifImageExists(String imagename) {
        Bitmap b = null;
        File file = ImageStorage.getImage("/" + imagename + ".jpg");
        String path = file.getAbsolutePath();

        if (path != null)
            b = BitmapFactory.decodeFile(path);

        if (b == null || b.equals("")) {
            return false;
        }
        return true;
    }
}

次に、画像にアクセスするには、まず画像が既に存在するかどうかを確認します。そうでない場合は、ダウンロードしてください。

if(ImageStorage.checkifImageExists(imagename)) {
    File file = ImageStorage.getImage("/"+imagename+".jpg");
    String path = file.getAbsolutePath();
    if (path != null){
        b = BitmapFactory.decodeFile(path);
        imageView.setImageBitmap(b);
    }
} else {
    new GetImages(imgurl, imageView, imagename).execute() ;
}
于 2014-04-24T12:50:01.000 に答える
34

ダウンロードするために独自のコードが本当に必要なのはなぜですか? URI をダウンロード マネージャーに渡すだけではどうですか?

public void downloadFile(String uRl) {
    File direct = new File(Environment.getExternalStorageDirectory()
            + "/AnhsirkDasarp");

    if (!direct.exists()) {
        direct.mkdirs();
    }

    DownloadManager mgr = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);

    Uri downloadUri = Uri.parse(uRl);
    DownloadManager.Request request = new DownloadManager.Request(
            downloadUri);

    request.setAllowedNetworkTypes(
            DownloadManager.Request.NETWORK_WIFI
                    | DownloadManager.Request.NETWORK_MOBILE)
            .setAllowedOverRoaming(false).setTitle("Demo")
            .setDescription("Something useful. No, really.")
            .setDestinationInExternalPublicDir("/AnhsirkDasarp", "fileName.jpg");

    mgr.enqueue(request);

}
于 2014-01-22T07:28:51.797 に答える
13

このコードはあなたを助けるかもしれません。

Button download_image = (Button) bigimagedialog.findViewById(R.id.btn_downloadimage);
                    download_image.setOnClickListener(new View.OnClickListener()

{
    public void onClick (View v)
    {
        boolean success = (new File("/sdcard/dirname")).mkdir();
        if (!success) {
            Log.w("directory not created", "directory not created");
        }

        try {
            URL url = new URL("YOUR_URL");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);

            String data1 = String.valueOf(String.format("/sdcard/dirname/%d.jpg", System.currentTimeMillis()));

            FileOutputStream stream = new FileOutputStream(data1);

            ByteArrayOutputStream outstream = new ByteArrayOutputStream();
            myBitmap.compress(Bitmap.CompressFormat.JPEG, 85, outstream);
            byte[] byteArray = outstream.toByteArray();

            stream.write(byteArray);
            stream.close();

            Toast.makeText(getApplicationContext(), "Downloading Completed", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
于 2013-03-21T14:30:46.983 に答える
0

このコードは私のプロジェクトで完全に実行されます

downloadImagesToSdCard(imagepath,imagepath);

private void downloadImagesToSdCard(String downloadUrl,String imageName)
        {
            try
            {
                URL url = new URL("www.xxx.com"+downloadUrl); 
                /* making a directory in sdcard */
            //  String sdCard=Environment.getExternalStorageDirectory().toString();
                ContextWrapper cw = new ContextWrapper(getActivity());
                 // path to /data/data/yourapp/app_data/imageDir
                File directory = cw.getDir("files", Context.MODE_PRIVATE);

                File myDir = new File(directory,"folder");

                /*  if specified not exist create new */
                if(!myDir.exists())
                {
                    myDir.mkdir();
                    Log.v("", "inside mkdir");
                }

                /* checks the file and if it already exist delete */
                String fname = imageName;
                File file = new File (myDir, fname);
                Log.d("file===========path", ""+file);
                if (file.exists ()) 
                    file.delete (); 

                /* Open a connection */
                URLConnection ucon = url.openConnection();
                InputStream inputStream = null;
                HttpURLConnection httpConn = (HttpURLConnection)ucon;
                httpConn.setRequestMethod("GET");
                httpConn.connect();
                inputStream = httpConn.getInputStream();
                /*if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) 
                {
                    inputStream = httpConn.getInputStream();
                }*/

                FileOutputStream fos = new FileOutputStream(file);  
                int totalSize = httpConn.getContentLength();
                int downloadedSize = 0;   
                byte[] buffer = new byte[1024];
                int bufferLength = 0;
                while ( (bufferLength = inputStream.read(buffer)) >0 ) 
                {                 
                    fos.write(buffer, 0, bufferLength);                  
                    downloadedSize += bufferLength;                 
                    Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
                }   

                fos.close();
                Log.d("test", "Image Saved in sdcard..");  
                viewimage();
            }
            catch(IOException io)
            {                  
                io.printStackTrace();
            }
            catch(Exception e)
            {                     
                e.printStackTrace();
            }


        } 

        public void viewimage()
        {
              String path = serialnumber+".png";
               ContextWrapper cw = new ContextWrapper(getActivity());

                //path to /data/data/yourapp/app_data/dirName
                File directory = cw.getDir("files", Context.MODE_PRIVATE);

                File mypath=new File(directory,"folder/"+path);

                Bitmap b;
                try {
                    b = BitmapFactory.decodeStream(new FileInputStream(mypath));
                //  b.compress(format, quality, stream)
                    profile_image.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false));
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
于 2015-07-25T13:32:11.670 に答える
0

これを試して

 try
                {
                    Bitmap bmp = null;
                    URL url = new URL("Your_URL");
                    URLConnection conn = url.openConnection();
                    bmp = BitmapFactory.decodeStream(conn.getInputStream());
                    File f = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".jpg");
                    if(f.exists())
                        f.delete();
                    f.createNewFile();
                    Bitmap bitmap = bmp;
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
                    byte[] bitmapdata = bos.toByteArray();
                    FileOutputStream fos = new FileOutputStream(f);
                    fos.write(bitmapdata);
                    fos.flush();
                    fos.close();
                    Log.e(TAG, "imagepath: "+f );
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
于 2017-06-14T09:39:29.810 に答える