zoukankan      html  css  js  c++  java
  • 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完全扫描不到图片。但奇怪的是二种情况下都不会报异常。

    查询的关键语句是:

    [java] view plain copy
     
    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.   
    5.                 //只查询jpeg的图片  
    6.                 Cursor mCursor = mContentResolver.query(mImageUri, null,  
    7.                         MediaStore.Images.Media.MIME_TYPE + "=?",  
    8.                         new String[] { "image/jpeg"}, MediaStore.Images.Media.DATE_TAKEN);  
    9.   
    10.                 mCursor.moveToLast();  
    11.                 int num = mCursor.getCount();  
    12.                   
    13.                  do{  
    14.                     //获取图片的路径  
    15.                     String path = mCursor.getString(mCursor  
    16.                             .getColumnIndex(MediaStore.Images.Media.DATA));  
    17.                     if(path.contains("/DCIM/Camera")){  
    18.                         imgPaths.add(path);  
    19.                     }  
    20.                 }while (mCursor.moveToPrevious());  
    21.   
    22.                 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、每次查询前,应该发广播更新下:

    [java] view plain copy
     
    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,当然也可以传

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

  • 相关阅读:
    bzoj1053(反素数)
    poj1442(对顶堆)
    poj2823(单调队列)
    poj3630(简单tire)
    poj1924(单调栈求最大矩阵)
    最大xor路径(poj3764)
    poj2689
    求n!末尾0的个数
    BigInteger和BigDecimal的基本用法
    大数乘法
  • 原文地址:https://www.cnblogs.com/exmyth/p/8430369.html
Copyright © 2011-2022 走看看