安卓保存网络图片并通知图库更新
最近有个需求刚好是这个,但是发现网络图片保存到手机后图库并没有及时刷新出来,捣鼓了一上午终于搞出来了
废话不说直接上代码:
首先是写个异步请求网络图片
// 异步任务 直接传图片地址
public void addTask(String url) {
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
// 后台通信
return decodeBitmap(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
// 主线程处理view
if (bitmap != null) {
//保存
saveImageToGallery(context, bitmap);
}
}
}.execute(url);
}
接着是url 转为bitmap的方法
/**
* url 到 bitmap
* @param httpUrl
* @return
*/
private Bitmap decodeBitmap(String httpUrl) {
URL url = null;
Bitmap bm = null;
try {
url = new URL(httpUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
InputStream in = url.openStream();
bm = BitmapFactory.decodeStream(in);
} catch (IOException e) {
e.printStackTrace();
}
return bm;
}
接下来是保存bitmap到本地通知图库的方法
/**
* 保存图片到图库的方法
*
* @param context
* @param bmp
*/
public void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(), "picdir");
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
Toast.makeText(context, "保存图片", Toast.LENGTH_SHORT).show();
MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
} catch (Exception e) {
e.printStackTrace();
}
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory() + "/picdir")));
// Uri uri = Uri.fromFile(file); //file 是你图片的路径 直接更新图片的路径更好(建议使用)
// context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
Toast.makeText(context, "图库更新成功", Toast.LENGTH_SHORT).show();
}
附上调用的片段吧:
好了,就是如此简单.注意6.0以上直接访问读写文件需要注意检查权限!!!