Android实现图片下载到本地的教程

1. 整体流程

首先我们来看一下整个实现图片下载到本地的流程:

erDiagram
    CUSTOMER ||--o| DOWNLOAD : 下载
    DOWNLOAD ||--o| LOCAL_STORAGE : 存储到本地

2. 具体步骤

接下来我们来详细说明每一步需要做什么以及需要使用的代码:

步骤一:下载图片

// 创建一个异步任务AsyncTask用于下载图片
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    protected Bitmap doInBackground(String... urls) {
        String imageUrl = urls[0];
        Bitmap bitmap = null;
        try {
            InputStream in = new java.net.URL(imageUrl).openStream();
            bitmap = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return bitmap;
    }
}

步骤二:保存图片到本地

// 保存图片到本地
private void saveImageToStorage(Bitmap bitmap) {
    String fileName = "image.jpg";
    try {
        // 获取图片存储路径
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imageFile = new File(storageDir, fileName);

        // 创建文件输出流
        FileOutputStream out = new FileOutputStream(imageFile);

        // 将Bitmap压缩为JPEG格式并写入文件
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();

        // 通知系统图库更新
        MediaScannerConnection.scanFile(this, new String[] { imageFile.getAbsolutePath() }, null, null);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 完整代码

// 引入必要的包
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;
import android.widget.ImageView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.media.MediaScannerConnection;

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 为了避免在主线程中进行网络请求导致的异常,需要设置StrictMode
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        imageView = findViewById(R.id.imageView);

        String imageUrl = "

        // 执行异步任务下载图片
        new DownloadImageTask().execute(imageUrl);
    }

    // 创建一个异步任务AsyncTask用于下载图片
    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        protected Bitmap doInBackground(String... urls) {
            String imageUrl = urls[0];
            Bitmap bitmap = null;
            try {
                InputStream in = new java.net.URL(imageUrl).openStream();
                bitmap = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return bitmap;
        }

        // 下载完成后保存图片到本地
        protected void onPostExecute(Bitmap bitmap) {
            imageView.setImageBitmap(bitmap);
            saveImageToStorage(bitmap);
        }
    }

    // 保存图片到本地
    private void saveImageToStorage(Bitmap bitmap) {
        String fileName = "image.jpg";
        try {
            // 获取图片存储路径
            File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
            File imageFile = new File(storageDir, fileName);

            // 创建文件输出流
            FileOutputStream out = new FileOutputStream(imageFile);

            // 将Bitmap压缩为JPEG格式并写入文件
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();

            // 通知系统图库更新
            MediaScannerConnection.scanFile(this, new String[] { imageFile.getAbsolutePath() }, null, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

通过以上代码,你可以实现将图片从网络上下载到本地存储。希望这篇文章对你有所帮助,祝你学习进步!