问题背景:

参考链接 做了一个图片浏览,用ContentResolver扫描图库照片,且严格按照时间拍摄顺序排好序显示在listview里。如下图所示:

遇到的问题是在4.2的手机上能正常显示,但是新增了照片,这个扫描依旧么变化。实在是恼火。另一个严重的问题是,在4.4的手机上,一张图片都跑不起来。大爷的,真是坑爹到家了。浪费我好几个小时,后来几乎要放弃了,无意中浏览自己以前写的博客,才发现真正的原因是少了一个权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

需要有以下两个权限,才能在发广播更新时起到作用。尤其是第二个权限,没这个权限在4.2的手机上可以浏览但不会更新,在4.4完全扫描不到图片。但奇怪的是二种情况下都不会报异常。

查询的关键语句是:

  1. <span style="font-family:'Comic Sans MS';font-size:18px;">              Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  2. Log.i("yanguoqi", "mImageUri = " + mImageUri.getPath());
  3. ContentResolver mContentResolver = MainActivity.this.getContentResolver();
  4. //只查询jpeg的图片
  5. Cursor mCursor = mContentResolver.query(mImageUri, null,
  6. MediaStore.Images.Media.MIME_TYPE + "=?",
  7. new String[] { "image/jpeg"}, MediaStore.Images.Media.DATE_TAKEN);
  8. mCursor.moveToLast();
  9. int num = mCursor.getCount();
  10. do{
  11. //获取图片的路径
  12. String path = mCursor.getString(mCursor
  13. .getColumnIndex(MediaStore.Images.Media.DATA));
  14. if(path.contains("/DCIM/Camera")){
  15. imgPaths.add(path);
  16. }
  17. }while (mCursor.moveToPrevious());
  18. mCursor.close();</span>

1、查询时mContentResolver.query(mImageUri。。。)这个uri只能填写Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;构造出来的URI。而不能随便写个路径构造个URI,这块着实诡异;

2、所以为了过滤,只能扫描后通过if(path.contains("/DCIM/Camera"))这句话来过滤图库下面的文件;

3.为了实现严格按照拍照时间排序,光在查询里写MediaStore.Images.Media.DATE_TAKEN还不中,这么写查出来的cursor第一个确实是最新的,但是通过List.add操作,反而把第一个排到最后了。因此我先将cursor移动最后,之所以do在前面while在后,是为了不漏掉第一个图片。

4、每次查询前,应该发广播更新下:

  1. <span style="font-family:'Comic Sans MS';font-size:18px;">  private void updateGallery(){
  2. Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);   //, MediaStore.Images.Media.EXTERNAL_CONTENT_URI
  3. String path = Environment.getExternalStorageDirectory() + "/DCIM/Camera";
  4. Uri uri = Uri.fromFile(new File(path));
  5. intent.setData(uri);
  6. this.sendBroadcast(intent);
  7. }</span>

在发广播处,可以指定path路径的uri,当然也可以传

  1. <span style="font-family:'Comic Sans MS';font-size:18px;"> MediaStore.Images.Media.EXTERNAL_CONTENT_URI</span>

Android4.4 ContentResolver查询图片无效 及 图库删除 增加图片后,ContentResolver不更新的问题解决的更多相关文章

  1. Android4.4 ContentResolver查询图片无效 及 图库删除 添加图片后,ContentResolver不更新的问题解决

    问题背景: 參考链接 做了一个图片浏览,用ContentResolver扫描图库照片.且严格依照时间拍摄顺序排好序显示在listview里.例如以下图所看到的: watermark/2/text/aH ...

  2. 周记4——vue中动态添加图片无效、build上线后background-image路径问题

    又是一个周五,又一周要过去了...很开心,这周遇到了vue中的一个比较常见的坑,网上随便一搜就有了很多解决方案...“幸运”的是,我选了一个带坑的方案...所以我觉得有必要记录一下这个“坑中坑”... ...

  3. Android 如何从系统图库中选择图片

    转:http://blog.csdn.net/tody_guo/article/details/7560270 这几天我都在做Android的App,同时学习它的API,我将分享一些我学到的东西,比如 ...

  4. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...

  5. 【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】

    iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...

  6. android 开发 实现一个进入相机拍照后裁剪图片或者进入相册选中裁剪图片的功能

    实现思维路径: 以进入相机拍照的思维路线为例子: 1.进入app 2.判断之前是否保存头像,如果有就显示历史图像 (下面代码中在getOldAvatar();方法中执行这个逻辑) 3.点击更换图像的B ...

  7. 换主页轮播的主题图片(4、删除)---轻开电子商务系统(企业入门级B2C站点)

    接(  换主页轮播的主题图片1 ) 文件:site/links/img0.html中的表单(第11行最后一个td) <td><if x="@{sys:canDo}" ...

  8. 图片处理:html文本获取图片Url,判断图片大小,存数据库

    1.从html文本获取图片Url /** * html文本中取出url链接 */ public class Url { public static void main(String[] args) { ...

  9. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

随机推荐

  1. SpringBoot+SpringData 整合入门

    SpringData概述 SpringData :Spring的一个子项目.用于简化数据库访问,支持NoSQL和关系数据存储.其主要目标是使用数据库的访问变得方便快捷. SpringData 项目所支 ...

  2. oracle 11g 分区表创建(自动按年、月、日分区)

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不 ...

  3. Vue之组件使用(一)

    这仅仅是个人为了防止忘记做的笔记而已,仅供参考,有不对的地方请纠正 组件这种东西用来封装多次使用的控件还是很有用处的,我还是挺喜欢这种模式,优化了前端的工作,写个组件也比较简单.下次有时间记录一下样式 ...

  4. (一)认识Sass和Compass

    第一章 Sass和Compass让样式表重焕青春 // 内容概要// 开始学习Sass和动态样式表// 用Sass更高效地写样式表// Compass简介// 用Compass迎接工程实践中的样式挑战 ...

  5. OSGI企业应用开发(六)细说Blueprint & Gemini Blueprint(一)

    上篇文章介绍了如何使用Blueprint將Spring框架整合到OSGI应用的Bundle中,从上篇文章中我们大概了解了Blueprint与Gemini Blueprint的关系,简单的说,Bluep ...

  6. Oracle 用户、角色管理简介

    Oracle 用户.角色管理简介 by:授客 QQ:1033553122 创建用户 形式1:创建名为testacc2的用户 CREATE USER testacc2 IDENTIFIED BY abc ...

  7. Hive 锁 lock

    Hive + zookeeper 可以支持锁功能 锁有两种:共享锁.独占锁,Hive开启并发功能的时候自动开启锁功能 1)查询操作使用共享锁,共享锁是可以多重.并发使用的 2)修改表操作使用独占锁,它 ...

  8. Reactjs-generator-cli 一款基于Ink构建用于快速搭建React应用的CLI scaffolding工具

    Reactjs-generator-cli 一款基于Ink构建用于快速搭建React应用的CLI scaffolding工具 A simple CLI for scaffolding React.js ...

  9. 【three.js练习程序】拖动选中的物体

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Docker相关概念

    一.概念 ①云计算:是一种资源的服务模式,该模式可以实现随时随地,便捷按需地从可配置计算资源共享池中获取所需的资源(如网络.服务器.存储.应用及服务),资源能够快速供应并释放,大大减少了资源管理工作的 ...