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

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的删除而自动清理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值