开发中遇到这样一个问题,在使用文件流的方式保存一张图片到本地后,打开相册,却并没有发现保存的图片,然而在 文件管理器 中却能看到。原本以为是保存的路径问题,然后将下载路径改到了系统的 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 不同而已。
网友评论