Android Camera存图片到SD卡 及时更新的问题


简单套着网上的例子,做了个Android Camera, 在存储图片的时候遇到了点问题,

如new File后,要检查文件是否存在,如果不存在,才真正调用createNewFile或mkdir()

(mkdirs())来创建文件或目录,要创建FileOutputStream来调用对应的write 方法写文件。


之后又遇到了文件未即使刷新,Gallery里面看不到的问题。原因听说是数据只是存储到了

SD卡,并未将此信息更新到数据库,而我们用Gallery查看图片的时候,却是通过读取数据库

里面的数据信息的,所以就看不到。


那是否有办法刷新呢?  肯定是有的,在网上查找,找到了关于Media Scanner的相关信息,提供了

扫描SD卡或者指定文件的方法。扫描SD卡就有点小题大做了,于是想到是否能只是扫描文件夹的方式。


通过 Intent.ACTION_MEDIA_MOUNTED 进行整个SD卡扫描:


通过 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 扫描某个文件:


经过搜索,发现直接扫描文件夹是不可行的。如果文件夹里面的文件较少,可以直接采用遍历文件的方式,

对每个文件进行扫描。


有篇文章,反映了这个问题,http://hxsdit.com/1647   

保存图片到SD卡,但是Gallery中不能及时显示的问题 

各手机厂商实现不太一致,当保存图片后打开gallery时,有的会自动给你刷新,有的不行,

这样就导致图片保存到SD卡上时,不能及时在gallery中看到,遇到这种情况最好是自己刷新。

通过 Intent.ACTION_MEDIA_MOUNTED 进行整个SD卡扫描:


  public void sdScan(){     
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"    
                    + Environment.getExternalStorageDirectory())));     
    }



通过 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 扫描某个文件:

 public void fileScan(String filePath){     
        Uri data = Uri.parse("file://"+filePath);     
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));     
    }


注:filePath为图片在SD卡中的地址,当保存图片后,调用以上方法即可;

 sendBroadcast为类Context的一个方法。


话虽这样,可是当我之际尝试直接使用这个sendBroadcast的时候,Eclipse IDE

就是错误(什么需要Context对象。。),可后来发现写好后,就不提示错误了,

囧。。。


CSDN上有位大哥提供的如下语句在我这里也不可行:

getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));


经过多番搜索,最终发现了个好文章,地址: http://www.blogjava.net/Green-nut/articles/336256.html ,

贴出相关的部分:



ublic void fileScan(String fName){
Uri data = Uri.parse("file:///"+fName);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));
}


补充: 上述方法是不支持对文件夹的 即:Uri data 必须是 文件的Uri 

 如果是文件夹的 其不会起作用的 切记!


- 如何扫描某文件夹下所有文件 难道就不可以么? 当然不 借助于

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 我们可以这么做: 


取出该文件夹下的所有子文件 

-----如其是文件且类型符合条件 就取出该文件目录 

以 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE方式发送至MediaScannerReceiver   

-----若其为文件夹 则迭代查询之    故实现为:


  1. public void fileScan(String file){  
  2.         Uri data = Uri.parse("file://"+file);  
  3.           
  4.         Log.d("TAG","file:"+file);  
  5.         sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));  
  6.     }  
  7.       
  8.     public void folderScan(String path){  
  9.         File file = new File(path);  
  10.           
  11.         if(file.isDirectory()){  
  12.             File[] array = file.listFiles();  
  13.               
  14.             for(int i=0;i<array.length;i++){  
  15.                 File f = array[i];  
  16.                   
  17.                 if(f.isFile()){//FILE TYPE  
  18.                     String name = f.getName();  
  19.                       
  20.                     if(name.contains(".mp3")){  
  21.                         fileScan(f.getAbsolutePath());  
  22.                     }  
  23.                 }  
  24.                 else {//FOLDER TYPE  
  25.                     folderScan(f.getAbsolutePath());  
  26.                 }  
  27.             }  
  28.         }  
  29.     }  



等我的Camera小程序写的差不多的时候再贴上来。由于网上信息量太多,找到

合适答案的地方还真不多,在此Mark下,如果有幸能帮到各位,我将不甚欣慰。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值