MediaProvider相当于一个数据中心,SD卡上所有的数据在这里都有记录,而Gallery的什用就是展示和操作这个数据中心,每次用户启动Gallery时,Gallery只是读取MediaProvider里面的记录并显示用户。如果用户在Gallery里删除一个媒体时,Gallery通过调用MediaProvider开放的接口来实现。
MediaProvider和Gallery的大致关系就是这样的了。我现在碰到的问题要解决的话,必须要搞清楚一件事才能继续往下走:
因为Gallery启动时是不会给MediaProvider发送命令让它扫描全盘的。那么,当SD卡上的数据有更新时(比如通过蓝牙接收一个媒体、从网上下载一个媒体、删除一个媒体等操作),MediaProvider如何知道这些变化然后更新自己的数据库的呢?
在这里不考虑用户通过PC上的USB传输到SD卡上的问题。因为SD卡重新挂载时,MediaProvider会自动扫描SD卡上的媒体来更新媒体数据库的。
那么只有一个答案了,谁更新了SD卡上的媒体,谁通知MediaProvider把更新了的媒体同步到MediaProvider的媒体数据库中。有两种方式,恰好蓝牙和下载器分别使用了这两种方式,这里就以它们两个程序来说明一下。
1、MediaScannerConnection,蓝牙传输文件时就是用的这种方式,每当接收到新的媒体文件,都会通过这种方式告诉MediaProvider同步媒体数据库。
建立连接
mConnection = new MediaScannerConnection(mContext, this);
因为建立连接是一个异步过程,所以,在建立连接时需要加入一个监听器。这样,连接建立后就可以得到通知,并进行下一步。
更新媒体数据库
mConnection.scanFile(mInfo.mFilename, mInfo.mMimetype);
这也是一个异步过程,更新完毕后,监听器中得到通知,并断开连接。
断开连接
mConnection.disconnect();
详细代码参考/packages/apps/Bluetooth下面BluetoothOppService.java中的MediaScannerNotifier这个类。
2、MediaScannerService,下载器DownloadProvider就是用的这种方式,当一个媒体文件下载完成后,直接绑定到MediaScannerService上,并调用mMediaScannerService.scanFile(info.mFileName, info.mMimeType);
这种方式比起上面的方式来,有两个缺点:
1、无法设置监听器。
2、scanFile本身是同步方法,扫描完成后才会返回,因此需要自己开一个新的线程来调用。
详细代码可以参考/packages/providers/DownloadProvider中DownloadService.java
任何一个应用程序,如果会更新SD卡上的媒体的话,都要记得使用上面两种方式中的一种来通知MediaProvider更新数据库。否则的话,用户打开Gallery是看不到我们的更新的。
分享到:
相关推荐
在Android系统中,判断双SD卡的存在是移动设备应用程序中常见的需求,特别是在处理大量数据存储或备份场景下。本项目“Android 判断双SD卡_CheckDoubleSDCard”提供了一个源码示例,帮助开发者理解如何在Android应用...
1. **文件系统访问**:Android设备上的外部存储(通常指的是SD卡)是通过`Environment.getExternalStorageDirectory()`来获取的。开发者需要权限`READ_EXTERNAL_STORAGE`来读取其中的文件。通过`MediaStore`类可以...
在Android平台上,开发Java应用程序时,我们经常需要处理与文件系统相关的任务,其中之一就是实现文件监听器。这个功能允许我们实时监控一个特定的文件夹,一旦该文件夹中有新的文件出现,程序可以立即做出响应,...
在Android系统中,SD卡(Secure Digital Card)是设备扩展存储空间的一种方式,通常用于存储用户数据、应用程序、媒体文件等。"SD卡搜索文件"的功能涉及到文件管理、搜索算法和UI更新,这些都是Android开发中的关键...
在Android平台上,将文字转换为图片是一项常见的需求,例如用于社交媒体分享、应用内通知或个性化设计等场景。本文将详细讲解如何实现这个功能,包括设置文字的大小、字体、颜色、透明度,以及背景色、背景透明度,...
在Android 7.0上,应用需要获取`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限来访问或修改外部存储(如SD卡)中的图片。开发者可能添加了适配代码来请求这些权限,并处理权限被拒绝的情况。 2. **Intent ...
7.5 存储卡中的图片 7.6 获取内置媒体文件 7.7 调节音量 7.8 播放mp3资源文件 7.9 录制音频 7.10 实现相机拍照功能 7.10.1 实现原理 7.10.2 编程思想 7.10.3 具体实现 7.11 自制3gp影片播放器 7.12 小结 第8章 网络...
- `android.permission.READ_EXTERNAL_STORAGE`:允许应用读取外部(SD卡)存储上的文件。 - `android.permission.WRITE_EXTERNAL_STORAGE`:允许应用写入外部存储,如保存图片、视频或文件。 6. **通讯录及短信...
通常,我们会遍历SD卡上的指定目录,查找所有的音频文件,然后将这些文件的路径存储到数据结构(如ArrayList)中。这个过程需要使用到`File`类和`FileInputStream`,并且需要注意处理各种可能的异常。对于Android ...
Android提供了`java.io.File`类来操作文件,通过`listFiles()`方法获取SD卡上的所有文件。同时,`Environment.getExternalStorageDirectory()`用于获取外部存储(如SD卡)的根目录。 2. **LRC歌词文件解析**:LRC是...
Android提供了`Environment.getExternalStorageDirectory()`方法获取外部存储(如SD卡)的根目录,然后通过文件路径或ContentProvider的URI来定位mp3文件。 3. **媒体库集成**:Android媒体库可以自动扫描并管理...
Android应用需要在AndroidManifest.xml中声明所需权限,如访问网络、读写SD卡等。系统在安装时会检查应用的权限需求,用户在安装时或运行时可对此进行授权。 十一、通知与消息推送 Notification是向用户展示非侵入...
知识点:SD 卡是 Android 系统中的一种外部存储设备,应用程序可以根据这个事件来进行存储空间管理和优化操作。 22. Intent.ACTION_MEDIA_BUTTON:当按下"Media Button"按键时,系统会发出此广播,通知相关应用程序...
这个压缩包中的主要文件`Android中文API合集.chm`是一个帮助文件,通常用于存储电子版的技术手册或指南,方便用户离线查阅。 Android API是Google为开发Android应用程序提供的接口,它涵盖了系统服务、UI框架、...
2. **文件系统访问**:Android设备上的外部存储(如SD卡)可以通过`Environment.getExternalStorageDirectory()`获取根目录。然后,通过遍历目录结构,可以找到并读取MP3音乐文件。`java.io.File`类用于文件操作,如...
音乐文件通常存储在外部存储(如SD卡)的特定目录下。 3. **多媒体数据库(MediaStore)**:Android系统维护了一个多媒体数据库,包含了设备上的音频、视频等资源信息。通过查询MediaStore.Audio.Media表,可以获取...
3. **文件扫描与过滤**: 要找到SD卡上的所有MP3文件,需要遍历目录并检查文件扩展名。可以使用`File`类和`FileInputStream`或`FileScanner`来读取目录结构,然后通过文件名后缀(".mp3")进行过滤。 4. **播放列表...
或者,如果音频文件位于SD卡中,可以通过文件路径初始化: ```java mediaPlayer = MediaPlayer.create(this, Uri.fromFile(new File("/sdcard/audio.mp3"))); ``` 2. 设置监听器: MediaPlayer有多个监听器,...
在Android平台上,开发一个简单的MP3格式音乐播放器涉及到多个关键知识点,主要涵盖`Android Service`、`MediaPlayer`以及如何处理外部存储中的音频文件。在这个项目中,我们将深入理解这些核心概念。 首先,我们来...
6.9 访问本机内存与存储卡——File的创建与删除 6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——...