热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转载—android媒体库数据更新解决办法总结

转载-原文地址:http:blog.csdn.nettrent1985articledetails23907093在项目中,我们经常要创建个自己的目录&

转载-原文地址:http://blog.csdn.net/trent1985/article/details/23907093
在项目中,我们经常要创建个自己的目录,里面存放一些图片啊文件之类,比如:我在SD卡中刚创建了一个文件夹A,里面放入了照片B,那么,这个时候我立马去Gallery里面查看这个目录里的照片,那么,我是无法看到的。

这是什么原因呢?

因为android系统在启动的时候会启动MediaScannerService扫描系统上的多媒体文件,然后将这些多媒体文件的信息加入到多媒体数据库中,应用程序要取得这些多媒体信息就是从这个多媒体数据库里面去取的,并不是从SD卡中取。也就是说,如果开机后增加或删除了一些多媒体,这个多媒体数据库是不会自动刷新的。

解决办法:1,开机重启;2,更新媒体库数据信息;

对于方法1,这个我们不可能添加个文件就去重启一次手机,因此这个pass。

对于方法2:

网上常用的方法是通过广播发送消息给系统,让系统自动更新一次媒体库,代码如下:

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

这里,我们可以发送两个消息:Intent.ACTION_MEDIA_MOUNTED 是对媒体库进行全扫描;Intent.ACTION_MEDIA_SCANNER_SCAN_FILE则是 扫描某个文件;

经测试,这个方法对于android4.4以下的版本,是没有问题的,但是从android4.4开始,使用这个方法,会出现如下图的异常:
这里写图片描述

这个问题会导致APP直接Crash。

经过查看SDK开发文档,我们发现,上述方法从android4.4开始,已经不再被允许。开发文档指出:4.4开始,不再允许非系统应用发送系统消息,而Intent.ACTION_MEDIA_MOUNTED正是系统消息,因此,为了解决不同版本的兼容问题,我们无法继续使用上述方法。

那要如何解决这个问题呢?

刚刚我们也说了,android系统在启动的时候会启动MediaScannerService扫描系统上的多媒体文件,那么,我们如果在查看Gallery之前,扫描一次多媒体文件,不是就解决了?

直接上代码:

private void updateGallery(String filePath)//filePath是我们的文件路径{MediaScannerConnection.scanFile(this,new String[] { filePath }, null,new MediaScannerConnection.OnScanCompletedListener() {public void onScanCompleted(String path, Uri uri) {Log.i("ExternalStorage", "Scanned " + path + ":");Log.i("ExternalStorage", "-> uri=" + uri);}});}

有了这个函数,当我们添加一个图像文件后,直接调用一下这个函数,对添加的图像文件进行扫描,就OK了,这样由于只是扫描了我们添加的文件,并非对整个媒体库文件进行扫描,因此,效率最高。经测试,上述方法可以完美解决媒体库更新的难题!

下面这点参考文章地址:http://www.cnblogs.com/ruiati/p/4061979.html
最后,在附上网上另外一种方法,也是利用MediaScannerConnection 类。代码如下:

MediaScannerConnection msc=new MediaScannerConnection(context,new MediaScannerConnectionClient(){
@Override
public void onMediaScannerConnected() {
// TODO Auto-generated method stub}
@Override
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub}
});
msc.connect();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URL url = null;
try {
url = fileSD_file.toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
}MimeTypeMap mtm=MimeTypeMap.getSingleton();msc.scanFile(fileSD_file.toString(), mtm.getMimeTypeFromExtension(mtm.getFileExtensionFromUrl(url.toString())));//此句上面的一句可以,下面的一句也可以,都适合这种方法(已用颜色标示)。// msc.scanFile(fileSD_file.getAbsolutePath(), null);msc.disconnect();

推荐阅读
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 通过 NuGet 获取最新版本的 Rafy 框架及其详细文档
    为了帮助开发者更便捷地使用Rafy领域实体框架,我们已将最新版的Rafy框架程序集上传至nuget.org,并同步发布了最新版本的Rafy SDK至Visual Studio。此外,我们还提供了详尽的文档和示例,以确保开发者能够快速上手并充分利用该框架的强大功能。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在HTML布局中,即使将 `top: 0%` 和 `left: 0%` 设置为元素的定位属性,浏览器中仍然会出现空白填充。这个问题通常与默认的浏览器样式、盒模型或父元素的定位方式有关。为了消除这些空白,可以考虑重置浏览器的默认样式,确保父元素的定位方式正确,并检查是否有其他CSS规则影响了元素的位置。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
author-avatar
青春梦敲门砖
我滴妈呀!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有