对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多媒体扫描路径问题相关推荐

  1. Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件

    Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息,比如开机.插拔SD卡.设备连接上电脑这种涉及到可能更改文件系统内容的情况下,会触发系统扫描文件系统中的多媒体文件 ...

  2. Android 音乐APP(一)扫描本地音乐

    效果图 音乐APP 扫描本地音乐 前言 正文 ① 新建项目 ② 第三方依赖 ③ 权限和基础配置 ④ 页面设计 ⑤ 权限请求 ⑥ 获取音乐数据 ⑦ 数据显示 结语 前言   这个项目纯粹的就是心血来潮, ...

  3. Android开发——Android中的二维码生成与扫描

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...

  4. 9.Android学习之动画与多媒体(二)

    目录 9.动画与多媒体(二) 2.播放音频与视频 2-1.使用MediaPlayer类播放音频 2-2.使用SoundPool类播放音频 2-3.使用 VideoView组件播放视频 4.难点解答 4 ...

  5. Android 自定义 Lint 实现静态代码扫描工具

    文章目录 关于静态代码扫描工具 Lint的简单使用 一.Lint 与 IDE 的结合使用 二.Lint 与 gradle 命令的结合使用 具体位置如下图: 生成的HTML在浏览器打开如图: 自定义 L ...

  6. android 解决小米手机上选择照片路径为null的问题

    之前做了一个获取相册选择图片的功能,后来测试人员在小米的手机 测试时出现崩溃现象.自己就在网上查找资料,发现是小米的获取图片路径的代码与其他的手机不一样,于是修改了代码,解决了这个问题,这里记录一下. ...

  7. Android初体验——运用手机多媒体

    使用通知 当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现.发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容. ...

  8. android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)

    写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载   zbarLib编译project  project下载0积分 bug 在2.3的系统中Hol ...

  9. [转载]android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)

    写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) 前天早上登陆CSDN时候一条消息:一网友提出了两点疑惑 扫描框目前只是做的假象,是全屏的图片进行解析 中文乱码现象 ...

最新文章

  1. java缓存技术选型,重难点整理
  2. 网站优化常见的五个易错点!
  3. Linux中的chmod权限问题
  4. 邓俊辉数据结构学习-3-栈
  5. [C.Sharp] 接口函数还可以声明为private
  6. 通过视频着色进行自监督跟踪
  7. 跨域iframe的高度自适应
  8. mysql存储引擎优化参数
  9. win10中通过docker安装sqlserver服务器的操作说明
  10. 大漠插件后台绑定模式备忘录
  11. 关于ppp、PPPoE、PPTP、L2TP、IPSec协议的简单认识
  12. 《工程伦理与学术道德》之《导论》
  13. 乐学成语(HappyIdiom)
  14. javascript创建对象方法总结
  15. 河北省 建筑标准规范 合集
  16. stop slave mysql_mysql执行stop slave一直卡在Killing slave的状态
  17. all在java语言什么意思_this什么意思
  18. SSD固态盘高低温测试方法
  19. 毕业设计-基于微信小程序的大学生返校考勤系统
  20. 本地缓存-loadingCache

热门文章

  1. react--(查询、重置)按钮封装
  2. 浏览器内核(四种内核)
  3. html 垂直居中一般用什么意思,html – 什么使元素上的文本垂直居中?
  4. 爱情呼叫转移-深度广度遍历合集
  5. 你可以在虚拟世界里过上美好生活吗?
  6. 奔腾n6000怎么样?相当于什么水平级别档次
  7. div的onblur事件
  8. 洛谷P1509 找啊找啊找G——教你如何花尽量少的时间泡更多的妹子
  9. 4g模块注册上网 移远_RK3399 4G模块移远EC20移植调试
  10. Django报错:__init__() missing 1 required positional argument: 'on_delete'