android 的Android Media Scanner多媒体扫描路径问题
对Android稍有熟悉的人都知道,Android Media Scanner只对SD卡上的媒体文件进行扫描。其扫描的策略,请参考《Android Media Scanner Process 》。假如我们的硬件平台上面没有提供SD卡槽,难道Android就不能进行对媒体文件播放了吗?当然不是的,否则Android系统将不会成为一个完善的Framework。本文结合本人的经验介绍一下,怎样修改多媒体文件的扫描路径。
根据《Android Media Scanner Process 》的介绍我们可以知道,Android scanner扫描媒体完成之后,会把媒体文件存放在数据库中,由MediaProvider为上层的应用程序提供服务。
经过研究Media scanner的代码发现,他的扫描路径为android.os.Environment.EXTERNAL_STORAGE_DIRECTORY。定义该变量文件位于:
frameworks/base/core/java/android/os/Environment.java
默认情况下,Android将会搜索/sddisk目录:
private static final File EXTERNAL_STORAGE_DIRECTORY = getDirectory("EXTERNAL_STORAGE", "/sddisk");
为了让其进行搜索我们自定义的路径,可以修改该变量的定义,加入我们希望扫描/external目录。代码修改如下:
private static final File EXTERNAL_STORAGE_DIRECTORY = getDirectory("EXTERNAL_STORAGE", "/external");
这样Android Media Scanner将会搜索/external目录来查找媒体文件。
下一步我们需要保证这个文件一定要存在,我们需要修改init.rc文件。增加如下的定义:
mkdir /external 0777 system system
这样在开机的时候,如果/external目录不存在,则会创建一个。如果已经存在,则不会有任何动作。
另外怎样触发Media Scanner?根据《Android Media Scanner Process 》 的介绍,当收到 ACTION_BOOT_COMPLETED,ACTION_MEDIA_MOUNTED,ACTION_MEDIA_SCANNER_SCAN_FILE 消息的时候才会进行扫描。以前是扫描SD卡,当SD卡mount的时候Android系统会有ACTION_MEDIA_MOUNTED消息通 知,Media Scanner开始扫描媒体文件。但是我们的/external目录修改之后,怎样通知Android media scanner扫描呢?一个办法是重启,没有人乐意这样做。另外一个办法是运行menu->dev tools->Media Scan,这样将会进行扫描。目前我还没有让目录修改之后,自动扫描的办法。如果你有好的点子,请你给我留言。
通过以上的步骤,可以在Android的/external目录存放媒体文件,并且被music应用程序播放了。当然还有不完善的地方欢迎各位朋友指正。
补充(于2010-9-20)
研究为什么Android系统会自动调用MediaScaner扫描文件呢?研究MediaScannerReceiver的源码发现:
@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Uri uri = intent.getData(); String externalStoragePath = Environment.getExternalStorageDirectory().getPath(); if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { // scan internal storage scan(context, MediaProvider.INTERNAL_VOLUME); } else { if (uri.getScheme().equals("file")) { // handle intents related to external storage String path = uri.getPath(); if (action.equals(Intent.ACTION_MEDIA_MOUNTED) && externalStoragePath.equals(path)) { scan(context, MediaProvider.EXTERNAL_VOLUME); } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) && path != null && path.startsWith(externalStoragePath + "/")) { scanFile(context, path); } } } }
我们发现在收到ACTION_BOOT_COMPLETED消息时,Android系统会扫描内存中的媒体文件。当系统收到ACTION_MEDIA_MOUNTED才会去扫描系统中的扩展内存(一般是SD卡)。
假如系统中有SD卡的话,系统启动的时候是可以收到ACTION_MEDIA_MOUNTED消息和ACTION_BOOT_COMPLETED消息的, 这样开机的时候系统会对系统进行媒体文件扫描。当SD卡文件修改了(比如用数据线,连接PC),一般也是有ACTION_MEDIA_MOUNTED消息 上报的。这样也可以实时更新媒体数据。
但是我们上面没有真正的SD卡,而是把一个内存中的目录设定为扩展内存。那么我们将永远不会受到ACTION_MEDIA_MOUNTED消息,所以也不 会自动扫描外存储内存中的媒体文件。那么你可能会问:为什么运行menu->dev tools->Media Scan就可以扫描外存储内存中的数据呢?这段代码的实现,在文件Development/src/com/android/development /MediaScannerActivity.java中:
@Override public void onResume() { super.onResume(); ........ sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); ........ }
可以看出这里面广播了一个ACTION_MEDIA_MOUNTED消息,这样MediaScannerReceiver将会扫描外存储内存中的媒体文件。
android 的Android Media Scanner多媒体扫描路径问题相关推荐
- Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件
Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息,比如开机.插拔SD卡.设备连接上电脑这种涉及到可能更改文件系统内容的情况下,会触发系统扫描文件系统中的多媒体文件 ...
- Android 音乐APP(一)扫描本地音乐
效果图 音乐APP 扫描本地音乐 前言 正文 ① 新建项目 ② 第三方依赖 ③ 权限和基础配置 ④ 页面设计 ⑤ 权限请求 ⑥ 获取音乐数据 ⑦ 数据显示 结语 前言 这个项目纯粹的就是心血来潮, ...
- Android开发——Android中的二维码生成与扫描
0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...
- 9.Android学习之动画与多媒体(二)
目录 9.动画与多媒体(二) 2.播放音频与视频 2-1.使用MediaPlayer类播放音频 2-2.使用SoundPool类播放音频 2-3.使用 VideoView组件播放视频 4.难点解答 4 ...
- Android 自定义 Lint 实现静态代码扫描工具
文章目录 关于静态代码扫描工具 Lint的简单使用 一.Lint 与 IDE 的结合使用 二.Lint 与 gradle 命令的结合使用 具体位置如下图: 生成的HTML在浏览器打开如图: 自定义 L ...
- android 解决小米手机上选择照片路径为null的问题
之前做了一个获取相册选择图片的功能,后来测试人员在小米的手机 测试时出现崩溃现象.自己就在网上查找资料,发现是小米的获取图片路径的代码与其他的手机不一样,于是修改了代码,解决了这个问题,这里记录一下. ...
- Android初体验——运用手机多媒体
使用通知 当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现.发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容. ...
- android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)
写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载 zbarLib编译project project下载0积分 bug 在2.3的系统中Hol ...
- [转载]android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)
写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) 前天早上登陆CSDN时候一条消息:一网友提出了两点疑惑 扫描框目前只是做的假象,是全屏的图片进行解析 中文乱码现象 ...
最新文章
- java缓存技术选型,重难点整理
- 网站优化常见的五个易错点!
- Linux中的chmod权限问题
- 邓俊辉数据结构学习-3-栈
- [C.Sharp] 接口函数还可以声明为private
- 通过视频着色进行自监督跟踪
- 跨域iframe的高度自适应
- mysql存储引擎优化参数
- win10中通过docker安装sqlserver服务器的操作说明
- 大漠插件后台绑定模式备忘录
- 关于ppp、PPPoE、PPTP、L2TP、IPSec协议的简单认识
- 《工程伦理与学术道德》之《导论》
- 乐学成语(HappyIdiom)
- javascript创建对象方法总结
- 河北省 建筑标准规范 合集
- stop slave mysql_mysql执行stop slave一直卡在Killing slave的状态
- all在java语言什么意思_this什么意思
- SSD固态盘高低温测试方法
- 毕业设计-基于微信小程序的大学生返校考勤系统
- 本地缓存-loadingCache
热门文章
- react--(查询、重置)按钮封装
- 浏览器内核(四种内核)
- html 垂直居中一般用什么意思,html – 什么使元素上的文本垂直居中?
- 爱情呼叫转移-深度广度遍历合集
- 你可以在虚拟世界里过上美好生活吗?
- 奔腾n6000怎么样?相当于什么水平级别档次
- div的onblur事件
- 洛谷P1509 找啊找啊找G——教你如何花尽量少的时间泡更多的妹子
- 4g模块注册上网 移远_RK3399 4G模块移远EC20移植调试
- Django报错:__init__() missing 1 required positional argument: 'on_delete'