您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-28 16:47 363 查看

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的删除而自动清理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: