扫描更新媒体库---因插入、删除等等原因需要更新系统图库

做一个功能,有这么一个需求:调用系统相机拍照,不能在系统的图库中产生图片,
1、指定图片data数据存储位置,`

File file = new File(Environment.getExternalStorageDirectory(), "/water/conservation/" + System.currentTimeMillis());
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        Uri imageUri = FileProvider.getUriForFile(MainActivity.this, "com.jph.takephoto.fileprovider", file);//通过FileProvider创建一个content类型的Uri
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
        startActivityForResult(intent, 1006);

后续问题1:小米、华为等等高端手机上没问题,只会在指定的位置存储图片,图片不会出现在系统相册的图库中,但是我公司自己生产的手机会莫名其妙的出现在系统图库中,也不知道是改了Android源码还是其他手机厂商做过优化,

解决办法1:所以当程序从系统相机返回后,在onActivityResult回调中删除图片

//伪代码
/**
*1、获取系统图库中所有照片
*2、将其名称拼接成时间戳
*3、与现下系统时间做对比,小于2分钟之内的图片全部删除
*4、file.delete()
*/

后续问题2:文件存储中的图片数据倒是删除了,但相册图库中会有灰色无法点击查看的缺省图片,最初是想发广播通知系统扫描图库,实测4.4版本后开发者无权限(只能由系统自己发这个广播ACTION_MEDIA_MOUNTED)

错误解决办法 :网上有很多人说 发这个广播Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri); 实测并没有用
doScanFile(path, mimeType, lastModifiedSeconds, file.length(),
false, true, MediaScanner.isNoMediaPath(path));这样也是一样,这只能刷新文件,是不能扫描文件目录的,所以也是无用,

最后找到了解决办法:ContentResolver resolver = getActivity().getContentResolver();
resolver.delete(Images.Media.EXTERNAL_CONTENT_URI, Images.Media.DATA + “=?”, new String[]{existingFilePath});
直接从MediaProvider删除即可,完美解决了上述问题,不过在查找博客的时候找到了直击源码的解决办法,没有试过不知道有没有用,但是这个思路是非常好的,这里贴出链接,以后学一学:https://www.jianshu.com/p/45f1b6e9b1a5, 它的原理是跟踪系统源码,整理出源码原理流程,跳过了发送广播ACTION_MEDIA_MOUNTED之前的操作,找到源码中发送广播以后的操作(也就是直接拉起MediaScannerService这个服务),这个解决办法非常厉害,不过要耗精力研究源码,比较花时间 可以在闲暇时去学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值