Como baixar e salvar uma imagem no Android

como se faz o download e a gravação de uma imagem de um dado url no Android?

Author: Lance Roberts, 2013-03-21

9 answers

Editar a partir de 30.12.2015-o Guia final para download de imagens


última actualização importante: Mar 31 2016


pare de falar, dê-me o código!!

Salta para o fundo desta publicação, copia o BasicImageDownloader (versão javadoc aqui ) no seu projecto, implemente a interface OnImageLoaderListener e acabou.

Nota : embora BasicImageDownloader trate de possíveis erros e will evitar que o seu aplicativo de bater em caso de algo correr mal, ele não vai executar qualquer pós-processamento (por exemplo, redução de tamanho) no descarregamento Bitmaps.


Uma vez que este post recebeu muita atenção, eu decidi reformulá - lo completamente para evitar que as pessoas usem tecnologias obsoletas, más práticas de programação ou apenas fazer coisas tolas-como procurar "hacks" para executar a rede no fio principal ou aceitar todas as certs SSL.

Criei uma demo. o projeto chamado "Image Downloader" que demonstra como baixar (e salvar) uma imagem usando a minha própria implementação de download, o Android built-in DownloadManager, bem como algumas bibliotecas populares de código aberto. Poderá ver o código-fonte completo ou obter o projecto no GitHub .

Nota : ainda não ajustei a gestão da autorização para o SDK 23+ (Marshmallow), pelo que o projecto visa o SDK 22 (Chupa-Chupa).

Na minha conclusão no final deste post eu vou compartilhar minha humilde opinião sobre o caso de uso adequado para cada forma particular de download de imagem que eu mencionei.

Vamos começar com uma implementação própria (você pode encontrar o código no final do post). Em primeiro lugar, este é um básicoImageDownloader e é isso. Tudo o que faz é ligar-se ao url dado, ler os dados e tentar descodificá-lo como um Bitmap, accionando a interface OnImageLoaderListener callbacks quando apropriado. A vantagem desta abordagem - é simples e você tem uma visão clara do que está acontecendo. Uma boa maneira de ir se tudo o que você precisa é baixar/exibir e salvar algumas imagens, enquanto você não se importa com a manutenção de uma cache de memória/disco.

Nota: no caso de imagens grandes, pode ser necessário dimensioná-las. para baixo.

--

O Android download é uma forma de deixar o sistema lidar com o download para você. É realmente capaz de baixar qualquer tipo de arquivos, não apenas imagens. Você pode deixar seu download acontecer silenciosamente e invisível para o usuário, ou você pode permitir que o usuário veja o download na área de notificação. Você também pode registrar um BroadcastReceiver para ser notificado após o download estar completo. A configuração é bastante simples, consulte o projeto vinculado para o código de exemplo.

Usar o DownloadManager geralmente não é uma boa ideia se você também quiser mostrar a imagem, uma vez que você é necessário ler e descodificar o ficheiro gravado em vez de apenas configurar o Bitmap transferido para um ImageView. O DownloadManager também não fornece nenhuma API para que você possa acompanhar o progresso de download.

--

Agora a introdução das grandes coisas-as bibliotecas. Eles podem fazer muito mais do que apenas baixar e exibir imagens, incluindo: criar e gerenciar a cache de memória/disco, redimensionar imagens, transformá-las e muito mais.

Vou começar com Volley , um poderosa biblioteca criada pelo Google e coberta pela documentação oficial. Apesar de ser uma biblioteca de rede de propósito geral não especializada em imagens, Volley apresenta uma API bastante poderosa para gerenciar imagens.

Terá de implementar uma classe Singleton para gerir os pedidos de Volley e está pronto para ir.

Você pode querer substituir o seu ImageView com o Volley's NetworkImageView, por isso o download basicamente torna-se um único encarte:

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

Se precisar de mais controle, isto é o que parece criar um ImageRequest com 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
                }
            });
Vale a pena mencionar que a Volley apresenta um excelente mecanismo de manipulação de erros, fornecendo a classe VolleyError que o ajuda a determinar a causa exata de um erro. Se o seu aplicativo faz um monte de networking e gestão de imagens não é o seu principal propósito, em seguida, Volley-lo um ajuste perfeito para você.

--

Picasso é uma biblioteca bem conhecida que fará todo o carregamento de imagens. coisas para ti. Apenas mostrar uma imagem usando Picasso é tão simples como:
 Picasso.with(myContext)
       .load(url)
       .into(myImageView); 

Por padrão, Picasso gerencia o cache de disco / memória para que você não precisa se preocupar com isso. Para obter mais controlo, pode implementar a interface Target e usá - la para carregar a sua imagem-isto irá fornecer callbacks semelhantes ao exemplo do Volley. Veja exemplos no projecto de demonstração.

Picasso também permite que você aplique transformações na imagem baixada e existem ainda outras bibliotecas em torno disso estendem essas API. Também funciona muito bem em um RecyclerView/ListView/GridView.

--

Universal Image Loader é uma outra biblioteca muito popular que serve o propósito da Gestão de imagens. Ele usa seu próprio ImageLoader que (uma vez inicializado) tem uma instância global que pode ser usada para baixar imagens em uma única linha de código:

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

Se quiser acompanhar o progresso da transferência ou aceder à transferência 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
                }
            });

O argumento neste exemplo é um objeto DisplayImageOptions. Consulte o projeto de demonstração para saber mais.

Similar ao Volley, o UIL fornece a classe FailReason que lhe permite verificar o que correu mal na falha de download. Por padrão, UIL mantém uma cache de memória / disco se você não diz explicitamente para não fazê-lo.

Nota : o autor mencionou que já não mantém o projeto a partir de 27 de Novembro de 2015. Mas uma vez que há muitos contribuintes, podemos esperar que o carregador de imagem Universal irá vive.

--

O Fresco do Facebook é a mais recente e (IMO) a biblioteca mais avançada que leva a gestão de imagens para um novo nível: de manterBitmaps fora do Monte java (antes do Chupa-Chupa) para suportar formatos animados e streaming JPEG progressivo .

Para saber mais sobre as ideias e técnicas por trás do Fresco, consulte este post.

O uso básico é bastante simples. Note que você vai precisar ligar para Fresco.initialize(Context); apenas uma vez, preferível na classe Application. Inicializar afrescos mais de uma vez pode levar a comportamentos imprevisíveis e erros de OOM.

O Fresco usa DraweeS para mostrar imagens, pode pensar neles como ImageView s:

    <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" />

Como pode ver, muitas coisas (incluindo as opções de transformação) já estão definidas em XML, por isso tudo o que precisa de fazer para mostrar uma imagem é uma linha única:

 mDrawee.setImageURI(Uri.parse(url));
O Fresco fornece uma API de personalização alargada, que, em circunstâncias, pode ser bastante complexo e requer que o Utilizador leia cuidadosamente os documentos (sim, por vezes tem de RTFM).

Incluí exemplos de JPEG progressivos e imagens animadas no projecto de amostra.


Conclusão: "aprendi sobre as coisas boas, o que devo usar agora?"

Note-se que o seguinte texto reflecte a minha opinião pessoal e deve não ser tomado como postulado.

  • se só for necessário transferir/gravar / mostrar algumas imagens, não planeie usá-las num Recycler-/Grid-/ListView e não precise de um monte de imagens para serem exibidas-ready, o BasicImageDownloader deve corresponder às suas necessidades.
  • se a sua aplicação gravar imagens (ou outros ficheiros) como resultado de um utilizador ou de uma acção automatizada e não precisar que as imagens sejam mostradas com frequência, use o Android Telecarregador.
  • no caso da sua aplicação fazer muita rede, transmite / recebe dados JSON, Funciona com imagens, mas esse não é o principal propósito da aplicação, vá com Volley.
  • a sua aplicação está focada na imagem/mídia, gostaria de aplicar algumas transformações nas imagens e não se preocupar com a API complexa: use Picasso (Nota: não oferece nenhuma API para acompanhar o estado de download intermédio) ou Universal Image Loader
  • se o seu aplicativo é tudo sobre Imagens, você precisa de funcionalidades avançadas, como a exibição de formatos animados e você está pronto para ler os documentos, vai com afresco.

No caso de não teres visto isso, o link do Github para o projecto de demonstração.


E aqui está o ... 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;
        }
      }
   }
 215
Author: Droidman, 2016-04-30 20:20:24

Acabei de resolver este problema e gostaria de partilhar o código completo que pode baixar, gravar no sdcard (e esconder o nome do ficheiro) e recuperar as imagens e, finalmente, verificar se a imagem já está lá. O url vem do banco de dados para que o nome do arquivo possa ser uniquamente fácil de usar id.

Primeiro obter as imagens

   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_); 
            }  
        }  
   }

Em seguida, criar uma classe para salvar e recuperar os arquivos

  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 ;
}
  }

Depois para aceder às imagens Primeiro verifique se é já lá se não transferir então

          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() ; 
            }
 31
Author: Nasz Njoka Sr., 2016-02-04 02:46:19
Porque é que precisas mesmo do teu próprio código para o baixar? Que tal passar o URI para o Gestor de Download?
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);

}
 29
Author: AnhSirk Dasarp, 2018-05-21 16:38:10
Pode ajudar-te..
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();
                            }
                        }
                    });
 12
Author: Ajay, 2013-03-21 14:30:46
Tenho uma solução simples que está a funcionar perfeitamente. O código não é meu, encontrei-o neste link . Aqui estão os passos a seguir:

1. Antes de baixar a imagem, vamos escrever um método para salvar bitmap em um arquivo de imagem no armazenamento interno no android. Ele precisa de um contexto, melhor usar o pass no contexto da aplicação por Get ApplicationContext(). Este método pode ser despejado em sua classe de atividade ou outro util classe.

public void saveImage(Context context, Bitmap b, String imageName) 
{
    FileOutputStream foStream;
    try 
    {
        foStream = context.openFileOutput(imageName, Context.MODE_PRIVATE);
        b.compress(Bitmap.CompressFormat.PNG, 100, foStream);
        foStream.close();
    } 
    catch (Exception e) 
    {
        Log.d("saveImage", "Exception 2, Something went wrong!");
        e.printStackTrace();
    }
}

2. Agora temos um método para gravar bitmap em um arquivo de imagem em andorid, vamos escrever A Máscara Asynct para baixar imagens por url. Esta classe particular precisa ser colocada em sua classe de atividade como uma subclasse. Depois que a imagem é baixada, no método onPostExecute, ele chama o método saveImage definido acima para salvar a imagem. Nota, o nome da imagem é hardcoded como " my_image.Forum".

private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
    private String TAG = "DownloadImage";
    private Bitmap downloadImageBitmap(String sUrl) {
        Bitmap bitmap = null;
        try {
            InputStream inputStream = new URL(sUrl).openStream();   // Download Image from URL
            bitmap = BitmapFactory.decodeStream(inputStream);       // Decode Bitmap
            inputStream.close();
        } catch (Exception e) {
            Log.d(TAG, "Exception 1, Something went wrong!");
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return downloadImageBitmap(params[0]);
    }

    protected void onPostExecute(Bitmap result) {
        saveImage(getApplicationContext(), result, "my_image.png");
    }
}

3. A Máscara de Asynct para baixar a imagem é definido, mas precisamos executá-lo para executar essa tarefa. Para isso, escreva esta linha no seu método de oncreato na sua classe de actividade, ou num método de onClick de um botão ou outros locais que considere adequados.

new DownloadImage().execute("http://developer.android.com/images/activity_lifecycle.png");

A imagem deve ser guardada em /data/data/your.aplicacao.packagename/files / my_ image.jpeg, verifique esta publicação para aceder a esta pasta a partir do seu dispositivo.

OMI, isto resolve o problema! Se você quiser mais passos, como carregar a imagem, você pode seguir estes extras degraus:

4. Depois que a imagem é baixada, precisamos de uma maneira de carregar o bitmap da imagem a partir do armazenamento interno, para que possamos usá-lo. Vamos escrever o método para carregar o mapa de imagens. Este método leva dois parâmetros, um contexto e um nome de arquivo de imagem, sem o caminho completo, o contexto.o openFileInput (imageName) irá procurar o ficheiro na pasta de gravação quando este nome de ficheiro foi gravado no método saveImage acima.

public Bitmap loadImageBitmap(Context context, String imageName) {
    Bitmap bitmap = null;
    FileInputStream fiStream;
    try {
        fiStream    = context.openFileInput(imageName);
        bitmap      = BitmapFactory.decodeStream(fiStream);
        fiStream.close();
    } catch (Exception e) {
        Log.d("saveImage", "Exception 3, Something went wrong!");
        e.printStackTrace();
    }
    return bitmap;
}

5.Agora temos tudo. precisávamos para definir a imagem de uma ImageView ou qualquer outra vista que você gosta de usar a imagem. Quando salvamos a imagem, marcamos o nome da imagem como "my_image".jpeg", agora podemos passar este nome da imagem para o método loadImageBitmap acima para obter o bitmap e configurá-lo para uma ImageView.

someImageView.setImageBitmap(loadImageBitmap(getApplicationContext(), "my_image.jpeg"));

6. Para obter o caminho completo da imagem pelo nome da imagem.

File file            = getApplicationContext().getFileStreamPath("my_image.jpeg");
String imageFullPath = file.getAbsolutePath();

7. verifique se o ficheiro de imagem existe.

Ficheiro =

getApplicationContext().getFileStreamPath("my_image.jpeg");
if (file.exists()) Log.d("file", "my_image.jpeg exists!");
  1. Para apagar o ficheiro da imagem.

    File file = getApplicationContext ().getFileStreamPath ("my_image.nivel"); sim (file.delete ()) Log.d ("file", " my_image.jpeg apagado!");

 3
Author: Gláucio Leonardo Sant'ana, 2017-06-27 12:51:44
Este código funciona perfeitamente no meu projecto.
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();
                }
        }
 0
Author: tej shah, 2015-07-25 13:32:11

Tenta isto

 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();
                }
 0
Author: Sunil, 2017-06-14 09:39:29
public class testCrop extends AppCompatActivity {
    ImageView iv;
    String imagePath = "https://style.pk/wp-content/uploads/2015/07/omer-Shahzad-performed-umrah-600x548.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testcrpop);
        iv = (ImageView) findViewById(R.id.testCrop);
        imageDownload image = new imageDownload(testCrop.this, iv);
        image.execute(imagePath);
    }
    class imageDownload extends AsyncTask<String, Integer, Bitmap> {
        Context context;
        ImageView imageView;
        Bitmap bitmap;
        InputStream in = null;
        int responseCode = -1;
//constructor.
        public imageDownload(Context context, ImageView imageView) {
            this.context = context;
            this.imageView = imageView;
        }
        @Override
        protected void onPreExecute() {
        }
        @Override
        protected Bitmap doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setDoOutput(true);
                httpURLConnection.connect();
                responseCode = httpURLConnection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    in = httpURLConnection.getInputStream();
                    bitmap = BitmapFactory.decodeStream(in);
                    in.close();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bitmap;
        }
        @Override
        protected void onPostExecute(Bitmap data) {
            imageView.setImageBitmap(data);
            saveImage(data);
        }

        private void saveImage(Bitmap data) {
            File createFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"test");
            createFolder.mkdir();
            File saveImage = new File(createFolder,"downloadimage.jpg");
            try {
                OutputStream outputStream = new FileOutputStream(saveImage);
                data.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
                outputStream.flush();
                outputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Resultadoenter image description here

Certifique-se que adicionou Permissão para gravar os dados na memória

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 0
Author: Opriday, 2017-09-28 14:40:54

Como o Google diz, por agora, não se esqueça de adicionar também legível no armazenamento externo no manifesto:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Fonte: http://developer.android.com/training/basics/data-storage/files.html#GetWritePermission

 -1
Author: Ludo, 2015-08-07 15:51:40