Android下载,保存图片(HttpURLConnection,Fresco)

来源:互联网 发布:java实施是做什么的 编辑:程序博客网 时间:2024/06/05 11:38

1⃣️下载图片

先上高端的Fresco下载的用法:(实际是缓存url的图片到本地了,下次加载同一个url会直接加载本地缓存的这个bitmap)

private void saveImageFromUrl(String url, Context context, final int i) {final ImageRequest imageRequest =        ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))            .setProgressiveRenderingEnabled(true).build();   DataSource<CloseableReference<CloseableImage>> dataSource = Fresco.getImagePipeline()                .fetchDecodedImage(imageRequest, context);        dataSource.subscribe(new BaseBitmapDataSubscriber() {            @Override            public void onNewResultImpl(Bitmap bitmap) {   //形参的bitmap即Fresco缓存到内存的Bitmap           //  saveBitmap(bitmap);   //下面是获取fresco缓存到磁盘的cnt图片的路径CacheKey cacheKey = DefaultCacheKeyFactory.getInstance()                .getEncodedCacheKey(imageRequest, this);BinaryResource resource = ImagePipelineFactory.getInstance().getMainFileCache().getResource(cacheKey);if (resource == null) return;File file = ((FileBinaryResource) resource).getFile();if (file == null) return;Log.i("wxbnbb", "saveImageFromUrl: " + file.getAbsolutePath());            }            @Override            public void onFailureImpl(DataSource dataSource) {            }        }, CallerThreadExecutor.getInstance());    }

再上普通的HttpURLConnection下载的用法:

 public void savePhoto() {        new Thread(new Runnable() {            @Override            public void run() {                url2bitmap(picUrl);            }        }).start();    } /**     * url转bitmap对象     *     * @param url     */    public void url2bitmap(String url) {        Bitmap bm = null;        try {            URL iconUrl = new URL(url);            URLConnection conn = iconUrl.openConnection();            HttpURLConnection http = (HttpURLConnection) conn;            int length = http.getContentLength();            conn.connect();            //获得图像的字符流            InputStream is = conn.getInputStream();            BufferedInputStream bis = new BufferedInputStream(is, length);            bm = BitmapFactory.decodeStream(bis);            bis.close();            is.close();            if (bm != null) {                saveBitmap(bm);            }        } catch (Exception e) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();                }            });            e.printStackTrace();        }    }

2⃣️用上面两种方法下载完bitmap后保存:

/**     * 保存bitmap到本地     *     * @param bitmap     */    private void saveBitmap(Bitmap bitmap) {        File appDir = new File(Environment.getExternalStorageDirectory(), "图片文件夹");        if (!appDir.exists()) appDir.mkdir();        String[] str = picUrl.split("/");        String fileName = str[str.length - 1];        File file = new File(appDir, fileName);        try {            FileOutputStream fos = new FileOutputStream(file);            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);            fos.flush();            fos.close();       //file.getAbsolutePath();//获取保存的图片的文件名        //    onSaveSuccess(file);        } catch (IOException e) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();                }            });            e.printStackTrace();        }    }

备注:如果要通知相册更新

 private void onSaveSuccess(final File file) {        runOnUiThread(new Runnable() {            @Override            public void run() {                sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));                Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show();            }        });    }

fresco的磁盘缓存数据并不会随着app的删除而自动清理