[Android] 针对生成的图片文件在系统Gallery不显示的处理
之前遇到过一个问题,就是发现我在程序中生成一个新的 Bitmap 之后,当我打开系统的 Gallery 查看时,并没有看到新生成的图像。然而打开文件浏览器,找到保存 Bitmap 所在的文件夹下,还能看到程序生成的 Bitmap 文件。也就是说,文件其实存在,但 Gallery 似乎并没有刷新。之后,又一个新的行为证实了我的观点,即,每次重启设备之后, Gallery 中就会显示新生成的 Bitmap 了。也就是说,重启设备之后,系统对某个保存有图片信息的文件进行了重新读写(当时得出的是这么个结论,具体原理后面会专门写博客讨论)。
好了,原理能猜出个大概,那么就猜一猜方法:也许可以通知系统来对保存有图片信息的那个文件进行刷新,做一次对文件夹的扫描。但到底有没有这个方法呢?带着疑问,我在网上找了找资料,发现原理的确是这么回事,方法也是有的。
本文地址:http://www.cnblogs.com/rossoneri/p/4239152.html
现在有两个方法可以解决这个问题:
Solution 1: 发送广播,通知系统刷新。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
不过用这个方法需要给程序添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
这个方法我没有测试,但看介绍应该是可以的。
Solution 2: 使用 MediaScannerConnection :
首先对要使用该方法的类继承 MediaScannerConnectionClient :
public class YourView implements MediaScannerConnectionClient {
}
继承该类需要重写两个方法:
@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub
try {
msc.scanFile(bitmapPath, "image/jpg");
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub
msc.disconnect();
}
方法看其名称就能猜到,前者是连接上 MediaScanner 后,进行查找文件。 bitmapPath 是文件的绝对路径,"image/jpg" 是文件格式, jpg 可改为 png 甚至 * 。后者方法是查找结束后断开连接。
最后,创建 MediaScannerConnection 对象,在生成图片后调用其方法:
MediaScannerConnection msc;
.....
if (msc != null) {
msc.disconnect();
}
msc = new MediaScannerConnection(mActivity, thisClass.this);
msc.connect();
这样,下次再生成新的图片后,就可以在 Gallery 中看到新生成的图片了!
恩,问题解决了。然后我又发现了一个问题:如果我在程序中删除了某个图片,结果发现 Gallery 中还有这个图片的路径,能看到有这个图片,但打开图片是一片灰色。说简单点,就是我用代码删除图片文件了,系统的保存信息还是有这个文件的路径存在,只有重启才会删掉这些无效路径。好了,问题来了,怎么改?
能不能像之前的步骤再来一次?前面的步骤好像是刷新了系统的某个配置文件,再做一次也许会行。尝试之后发现(第一种方法没试。。),然而并不行。
既然这样不行,那也许是我对系统的某些原理还没有搞懂,应该还有其他的方法。经过一番探索,我还是找到了解决方法,并且对 Android 系统扫描存储这些信息的原理有了进一步的了解。下一篇文章,就简单讨论讨论这个原理和解决办法。今天先到这里。
参考资料:
[Android实例] 把bitmap保存后无法在图库看到,但文件是存在的
Image, saved to sdcard, doesn't appear in Android's Gallery app
[Android] 针对生成的图片文件在系统Gallery不显示的处理的更多相关文章
- android将应用中图片保存到系统相册并显示
我应用到的场景是程序中在视频通讯时截图,将截图保存到本地相册中 /*** @param bmp 获取的bitmap数据 * @param picName 自定义的图片名*/ public static ...
- [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件
7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实 ...
- Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin
来源博客:Wang Jie's Blog 本文链接:<http://blog.wangjiegulu.com/2018/02/05/Android端生成META-INF信息文件的Gradle插件 ...
- Android之拨号界面图片风格,无信息默认显示界面修改
Android之拨号界面图片风格,无信息默认显示界面修改 点开Dialer app,出现拨号,联系人,收藏三个选项卡,也就是三个Fragment,在三个界面都没有信息的时候会显示一个时钟,联系人,收藏 ...
- Android从本地选择图片文件转为Bitmap,并用zxing解析Bitmap
如何从本地选择图片文件 使用Intent调用系统相册后,onActivityResult函数返回的是Uri格式的路径 /** * 打开系统相册 */ private void openSysAlbum ...
- Android lint 删除无用图片文件和配置文件
Android lint 删除无用.冗余的 配置文件和 图片资源 转载请注明 http://blog.csdn.net/aaawqqq?viewmode=contents Android项 ...
- Android的缓存图片不在系统图库中显示的解决办法
Android的图库会在开机的时候扫描SD卡中的图片,视频等文件,有很多App的私有图片不想在图库中显示,就需要另外处理了. 解决办法:在缓存图片的文件夹中创建 .nomedia 文件. 1. &qu ...
- Android开发之将图片文件转化为字节数组字符串,并对其进行Base64编码处理
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 转载请说明出处. /** * @将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * ...
- android Javah生成JNI头文件
项目要用到c语言库,因此来学习下jni 首先是在cmd中使用javah,出现了javah不是内部或外部命令的错误提示,javah是jdk自带的工具,提示说明在系统环境变量中没有jdk的路径,或者配置错 ...
随机推荐
- 设置JVM参数的几种方式解决java.lang.OutOfMemoryError:Java heap space
一.首先给出查询当前JVM内存的代码: 下面是查询当前JVM 内存大小的代码,可以测试设置后JVM 的内存是否会变化.增加JVM 内存的配置项后,无需重新启动eclipse .具体的代码如下: pub ...
- CodeSmith读取数据库
这两天在看CodeSmith文档,因为官方文档在读数据库这一篇使用的是VB写的,对于C#使用者来说看起来很不方便,所以我改成C#的,顺便写下我自己的使用过程. 首先,要使用CodeSmith连接数据库 ...
- StreamSets学习系列之StreamSets的Create New Pipeline(图文详解)
不多说,直接上干货! 前期博客 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel .Full Tarball .Full R ...
- WebMagic实现分布式抓取以及断点抓取
访问我的博客 前言 从去年到今年,笔者主要负责的是与合作方的内容对接,新增的合作商不是很多的情况下,在我自从去年引入了 WebMagic 这个爬虫框架之后,基本很少需要去关注维护爬虫,做的最多的是新接 ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形
完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形.历史上,人们花了很久才找到了若干完美正方形.比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 ...
- Java设计模式学习记录-适配器模式
前言 之前已经将五个创建型设计模式介绍完了,从这一篇开始介绍结构型设计模式,适配器模式就是结构型模式的一种,适配器要实现的效果是把“源”过渡到“目标”. 适配器模式 在开发过程中,使用一个已经存在的类 ...
- es6学习笔记3--解构和对象
1.解构 在接收数据的地方(比如赋值的左边),解构使你使用模式去获取部分数据. 下面的代码是解构的一个例子: let obj = { first: 'Jane', last: 'Doe' }; let ...
- 状态压缩·一(状态压缩DP)
描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市——那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票—— ...
- [转]SQL Server Reporting Services - Timeout Settings
本文转自:https://social.technet.microsoft.com/wiki/contents/articles/23508.sql-server-reporting-services ...
- Repeater控件,判断最少选择一行记录
本演示中,教会大家使用jQuery来判断Repeater控件,最少选择一行记录. 在Repeater控件中,每行第一列放置一个CheckBox,然后在Repeater控件之外,放置一个Button按钮 ...