APP 内保存图片相册中立即显示

开发中遇到这样一个问题,在使用文件流的方式保存一张图片到本地后,打开相册,却并没有发现保存的图片,然而在 文件管理器 中却能看到。原本以为是保存的路径问题,然后将下载路径改到了系统的 Pictures 目录下,发现并不能解决问题。通过搜索后发现,图库/相册 其实是通过ContentProvider 查询的图片URI 。在保存完图片之后,实际上图片的URI 并没有插入到 ContentProvider 的数据库中。因此,要想在相册中即时看到图片,还需要进行一些操作。不过也要分情况讨论:

1)如果是将图片保存在 系统自动扫描 的文件夹,比如DCIM,Pictures,Camera 等,对于系统相册来说,只需要发送广播进行扫描即可,数据会自动添加到ContentProvider 中,当然如果不发送广播,在手机重启或者过一段时间之后,扫描操作仍会开启,因此 绝对 不可以自己去进行插入操作,否则相册中会出现两张相同的照片。发送广播代码如下

File file = new File(filePath);    // filePath 是文件的保存路径,包括文件名

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));

context.sendBroadcast(intent);    // 发送广播

2)如果将图片保存在了自己创建的某个神奇路径,那可能需要自己手动向ContentProvider 中插入数据,示例代码如下

ContentValues values = new ContentValues();
File saveFile = new File(filePath); 
long timeMillis = System.currentTimeMillis(); 
values.put(MediaStore.MediaColumns.TITLE, saveFile.getName()); 
values.put(MediaStore.MediaColumns.DISPLAY_NAME, saveFile.getName()); 
values.put(MediaStore.MediaColumns.DATE_MODIFIED, timeMillis); 
values.put(MediaStore.MediaColumns.DATE_ADDED, timeMillis); 
values.put(MediaStore.MediaColumns.DATA, saveFile.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.SIZE, saveFile.length());
values.put(Images.Media.DESCRIPTION, description);
values.put(Images.Media.MIME_TYPE, "image/jpeg");            // 图片格式
// 插入到数据库
context.getApplicationContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

同理,在保存视频时,也需要进行如上类似的处理,只不过视频 和 图片的ContentValues 的key 不同而已。

你可能感兴趣的:(APP 内保存图片相册中立即显示)