简单套着网上的例子,做了个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
-----若其为文件夹 则迭代查询之 故实现为:
等我的Camera小程序写的差不多的时候再贴上来。由于网上信息量太多,找到
合适答案的地方还真不多,在此Mark下,如果有幸能帮到各位,我将不甚欣慰。