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


    问题背景:

    參考链接 做了一个图片浏览,用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全然扫描不到图片。

    但奇怪的是二种情况下都不会报异常。

    查询的关键语句是:

    				Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    				Log.i("yanguoqi", "mImageUri = " + mImageUri.getPath());
    				ContentResolver mContentResolver = MainActivity.this.getContentResolver();
    
    				//仅仅查询jpeg的图片
    				Cursor mCursor = mContentResolver.query(mImageUri, null,
    						MediaStore.Images.Media.MIME_TYPE + "=?",
    						new String[] { "image/jpeg"}, MediaStore.Images.Media.DATE_TAKEN);
    
    				mCursor.moveToLast();
    				int num = mCursor.getCount();
    				
    				 do{
    					//获取图片的路径
    					String path = mCursor.getString(mCursor
    							.getColumnIndex(MediaStore.Images.Media.DATA));
    					if(path.contains("/DCIM/Camera")){
    						imgPaths.add(path);
    					}
    				}while (mCursor.moveToPrevious());
    
    				mCursor.close();

    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、每次查询前,应该发广播更新下:

    	private void updateGallery(){
    		Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);   //, MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    		String path = Environment.getExternalStorageDirectory() + "/DCIM/Camera"; 
    		Uri uri = Uri.fromFile(new File(path));   
    		intent.setData(uri);   
    		this.sendBroadcast(intent);  
    	}

    在发广播处,能够指定path路径的uri,当然也能够传
     MediaStore.Images.Media.EXTERNAL_CONTENT_URI

  • 相关阅读:
    体验极佳的程序
    如何修改文档等系统文件的位置
    Demo
    Spring Boot与检索/ElasticSearch
    Java NIO:NIO概述
    Centos7 配置静态IP并使用xshell远程连接
    宏定义能否被赋值
    Centos7没有ETH0网卡
    Bringing up interface eth0: Device eth0 does not seem to be presen
    Git 常用命令
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10658139.html
Copyright © 2020-2023  润新知