`
java-mans
  • 浏览: 11341230 次
文章分类
社区版块
存档分类
最新评论

Android 音乐资源管理与播放

 
阅读更多
MediaScanner与音乐信息扫描

Android系统在SD卡插入后,MediaScanner服务会在后台自动扫描SD上的文件资源,将SD上的音乐媒体信息加入到MediaStore数据库中。程序可以直接从MediaStore中读取相应的媒体信息。通过注册监听MediaScanner广播的Intent,可以获知MediaScanner服务是否在进行后台的扫描工作:

Intent.ACTION_MEDIA_SCANNER_STARTED 表示MeidaScanner开始扫描;
Intent.ACTION_MEDIA_SCANNER_FINISHED 表示MediaScanner扫描结束;
当程序从网络下载媒体文件到终端后,MediaScanner服务并不会自动扫描刚刚下载的文件,需要程序主动去扫描这些新添加的媒体文件信息到MediaStore数据库中。在Android系统中有两种方式去主动扫描音乐媒体文件信息到
MediaStore数据库:

1.启动MediaScanner服务,扫描媒体文件:
程序通过发送下面的Intent启动MediaScanner服务扫描指定的文件或目录:
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件

java代码:
  1. public void scanFileAsync(Context ctx, String filePath) {
  2. Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  3. scanIntent.setData(Uri.fromFile(new File(filePath)));
  4. ctx.sendBroadcast(scanIntent);
  5. }
复制代码

“android.intent.action.MEDIA_SCANNER_SCAN_DIR”:扫描指定目录

java代码:
  1. public static final String ACTION_MEDIA_SCANNER_SCAN_DIR = "android.intent.action.MEDIA_SCANNER_SCAN_DIR";
  2. public void scanDirAsync(Context ctx, String dir) {
  3. Intent scanIntent = new Intent(ACTION_MEDIA_SCANNER_SCAN_DIR);
  4. scanIntent.setData(Uri.fromFile(new File(dir)));
  5. ctx.sendBroadcast(scanIntent);
  6. }
复制代码

这种扫描方式中,由于扫描工作是在MediaScanner服务中进行的,因此不会阻塞当前程序进程。当扫描大量媒体文件且实时性要求不高的情况下,适合使用该扫描方式。

2.通过MediaScanner提供的API接口,扫描媒体文件。
这种扫描媒体文件的方式是同步的,扫描工作将会阻塞当前的程序进程。当扫描少量文件,且要求立即获取扫描结果的情况下,适合使用该扫描方式。
在扫描媒体文件前,程序应该根据终端当前的语言环境正确设置MediaScanner的语言环境设置, 避免产生编解码的错误:

java代码:
  1. MediaScanner scanner = new MediaScanner(ctx);
  2. Locale locale = ctx.getResources().getConfiguration().locale;
  3. String language = locale.getLanguage();
  4. String country = locale.getCountry();
  5. scanner.setLocale(language + \"_\" + country);
复制代码

媒体文件可以存储在手机终端的内存中,也可以存储在SD卡中,Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。因此在扫描媒体文件时,要明确指明扫描的媒体文件是位于内部存储空间还是外部存储空间。外部存储空间和内部存储空间对应的卷标为”external”和”internal”。

java代码:
  1. scanner.scanSingleFile(filePath, volumeName, mimeType);
  2. scanner.scanDirectories(directories, volumeName);
复制代码
MediaStore与音乐信息查询
MediaScanner将扫描媒体文件获得的信息全部存储在MediaStore数据库中。MediaStore是基于SQLite数据库系统的,通过ContentProvider方式,程序可以对MediaStore数据库进行增删查改等操作。

MediaStore的数据库文件位于/data/data/com.android.providers/databases, 通常可以发现两个数据库文件
internal.db:对应内部存储空间的媒体数据库文件;
external-xxxxxxxx.db:对应外部存储空间的媒体数据文件,由于同一个手机终端可能使用多个SD卡,针对每一个SD卡,OPhone平台都会生成对应的媒体数据库文件。

两个数据库文件除了管理的文件所存储的位置不同外,没有其他区别。本文后续将默认以外部存储为例进行介绍。

使用SQLite命令打开数据库文件,可以看到Android多媒体数据库的基本结构:
>sqlite3 external-xxx.db
>.tables
>.schema
感兴趣的读者可以自己查看,本文不再一一列举。

MediaStore类是Android平台的多媒体数据库,它包含了音频,视频,图片等所有多媒体文件信息。本文将重点介绍如何管理和获取音频信息,视频和图片等信息的获取与管理与音频类似。

MediaStore以ContentProvider的形式向外提供媒体数据库信息。通过Android平台提供的ContentProvider接口,可以方便的访问数据库信息。

java代码:
  1. public Cursor query(Contex ctx, Uri _uri, String[] prjs, String selections, String[] selectArgs, String order) {
  2. ContentResolver resolver = ctx.getContentResolver();
  3. if (resolver == null) {
  4. return null;
  5. }
  6. return resolver.query(_uri, prjs, selections, selectArgs, order);
  7. }
复制代码

_uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考SDK开发文档。

prjs: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
selection: 指定查询条件
selectionArgs:参数selection里有?这个符号时,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null
order:指定查询结果的排列顺序
MediaStore.Audio.Media类定义了媒体数据库中的歌曲信息
MediaStore.Audio.Artists类定义了媒体数据库中的歌手信息
MediaStore.Audio.Albums类定义了媒体数据库中的专辑信息
MediaStore.Audio.Playlists类定义了媒体数据库中的播放列表信息


读者可以通过OPhone SDK开发文档找到详细的信息,结合ContentProvider的查询接口,可以获取所有媒体信息。
MediaPlayer与音乐播放MediaPlayer是Android多媒体编程中最核心的类。它提供了一个多媒体播放器常用的基本操作如播放,暂停,停止,获取文件播放长度等等。它向下通过JNI封装,获取系统提供的多媒体播放能力。

MeidaPlayer提供了设计良好的多媒体接口,播放一个音频文件的步骤非常简单:
1.创建播放器: new MediaPlayer()
2.设置音频源: setDataSource(Audio_PATH)
3.准备音频源: prepare()
4.播放音频: start()
5.停止播放: stop()
6.释放资源: release();


其他MediaPlayer常用接口例如pause(), getDuration(), seekTo()等,大家可以自己查阅SDK文档,这里不在一一介绍。
音频的播放过程也就是MediaPlayer对象的状态转换过程。深入理解MediaPlayer的状态机是灵活驾驭Android多媒体编程的基础。读者在Android SDK 开发文档中可以查看到MediaPlayer的状态转换图。程序有必要监听这些变化,判断播放器所处的状态,Android平台提供了多种监听器,来监视 MediaPlayer的状态变化:
MediaPlayer.OnBufferingUpdateListener
MediaPlayer.OnCompletionListener
MediaPlayer.OnErrorListener
MediaPlayer.OnPreparedListener
MediaPlayer.OnSeekCompleteListener


Android平台可以从资源文件、文件系统和网络三种方式来播放多媒体文件。无论使用哪种播放方式,基本的流程都是类似的。

从资源文件播放
多媒体文件可以放在资源文件夹/res/raw目录下,然后通过MediaPlayer.create(Context ctx, int file)方法创建MediaPlayer对象,获得MediaPlayer对象后直接调用start()方法即可播放音乐。
从文件系统播放
从文件系统播放音乐,需要使用new操作符创建MediaPlayer对象。获得MediaPlayer对象之后,需要依次调用setDataSource() 和prepare()方法,以便设置数据源,让播放器完成准备工作,然后调用start()方法播放音乐。

从网络播放
Android平台支持在线播放媒体音乐,通过 progress download的方式播放在线音频资源。Progress download的支持由底层的OpenCore多媒体库提供支持,应用开发者不必关心具体实现细节,只需要设置网络音频资源的地址,就可以完成在线播放的工作,极大提高了开发效率。由于从网络下载播放音频资源需要较长的时间,在准备音频资源的时候,需要使用prepareAsync()方法,这个方法是异步执行的,不会阻塞程序的主进程。MediaPlayer通过MediaPlayer.OnPreparedListener通知 MediaPlayer的准备状态。

在特定的情况下,程序需要通过代理服务器访问在线资源,例如,通过APN CMWAP访问网络时,需要设置CMWAP的代理地址(10.0.0.172:80)。Android平台提供了非常方便的解决方案,使开发者可以非常简单的通知OpenCore使用指定的代理来访问网络音频资源:在网络媒体的url后,通过“x-http-proxy”指定代理服务器地址。另外,由于 Android平台支持Multi PDP,可以同时建立多个APN连接,所以开发者必须指明哪个连接端口需要使用代理服务器,通过“x-net-interface”指定连接端口,下面的程序简单说明了通过代理服务器播放音频资源的步骤:

java代码:
  1. private void playFromNetwork() {
  2. String path = "http://website/path/test.mp3";
  3. String CMWAP_HOST = "10.0.0.172";
  4. String CMWAP_PORT = "80";

  5. //假设CMWAP连接的端口名
  6. String SOCKET_INTERFACE = "cminnet0";

  7. String urlWithProxy = path + "?x-http-proxy=" + CMWAP_HOST + ":" + CMWAP_PORT + "&" + "x-net-interface=" + SOCKET_INTERFACE ;
  8. try {
  9. MediaPlayer player = new MediaPlayer();
  10. player.setDataSource(path);
  11. player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  12. public void onPrepared(MediaPlayer player) {
  13. player.start();
  14. }
  15. });
  16. player.prepareAsync();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
复制代码
分享到:
评论

相关推荐

    Android编程实现使用SoundPool播放音乐的方法

    本文实例讲述了Android编程实现使用SoundPool播放音乐的方法。分享给大家供大家参考,具体如下: 如果应用程序要播放密集、短促的音效,这时还用MediaPlayer就显得不合适了。MediaPlayer存在如下缺点: 1、资源占用...

    基于Android网络音乐播放器的设计与实现.zip

    账号模块提供自己账号的管理,推送模块提供音乐资讯和歌单资源,交友模块提供和其他用户进行交互,搜索模块可以让用户自行搜索服务器提供的资源。 详细介绍参考:...

    Android开发与应用——张荣,原书配套课件

    这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    5.11 制作有图标的文件资源管理器——自定义Adapter对象 5.12 还原手机默认桌面——重写clearWallpaper方法 5.13 置换手机背景图——Gallery与setWallpaper整合实现 5.14 撷取手机现存桌面——getWallpaper与...

    《Google Android SDK开发范例大全(第3版)》.pdf

    5.11 制作有图标的文件资源管理器 210 5.12 还原手机默认桌面 215 5.13 置换手机后台图 217 5.14 获取手机现存桌面 221 5.15 文件资源管理器再进化 222 5.16 取得目前file与cache的路径 229 5.17...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    5.11 制作有图标的文件资源管理器——自定义Adapter对象 5.12 还原手机默认桌面——重写clearWallpaper方法 5.13 置换手机背景图——Gallery与setWallpaper整合实现 5.14 撷取手机现存桌面——getWallpaper与...

    Google Android SDK开发范例大全(第3版) 1/5

    5.11 制作有图标的文件资源管理器 5.12 还原手机默认桌面 5.13 置换手机后台图 5.14 获取手机现存桌面 5.15 文件资源管理器再进化 5.16 取得目前File与Cache的路径 5.17 打开/关闭WiFi服务 5.18 取得SIM卡内的信息 ...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    5.11 制作有图标的文件资源管理器——自定义Adapter对象 5.12 还原手机默认桌面——重写clearWallpaper方法 5.13 置换手机背景图——Gallery与setWallpaper整合实现 5.14 撷取手机现存桌面——getWallpaper与...

    基于 Android 网络音乐播放器APP【100011068】

    本系统为用户主要提供账号模块、推送模块、本地模块、交友模块、搜索...账号模块提供自己账号的管理,推送模块提供音乐资讯和歌单资源,交友模块提供和其他用户进行交互,搜索模块可以让用户自行搜索服务器提供的资源。

    Google Android SDK开发范例大全(第3版) 4/5

    5.11 制作有图标的文件资源管理器 5.12 还原手机默认桌面 5.13 置换手机后台图 5.14 获取手机现存桌面 5.15 文件资源管理器再进化 5.16 取得目前File与Cache的路径 5.17 打开/关闭WiFi服务 5.18 取得SIM卡内的信息 ...

    Google Android SDK开发范例大全(第3版) 3/5

    5.11 制作有图标的文件资源管理器 5.12 还原手机默认桌面 5.13 置换手机后台图 5.14 获取手机现存桌面 5.15 文件资源管理器再进化 5.16 取得目前File与Cache的路径 5.17 打开/关闭WiFi服务 5.18 取得SIM卡内的信息 ...

    Google Android SDK开发范例大全(第3版) 5/5

    5.11 制作有图标的文件资源管理器 5.12 还原手机默认桌面 5.13 置换手机后台图 5.14 获取手机现存桌面 5.15 文件资源管理器再进化 5.16 取得目前File与Cache的路径 5.17 打开/关闭WiFi服务 5.18 取得SIM卡内的信息 ...

    Android代码-一款基于萌否网站api的音乐管理软件

    Beats 是一款基于萌否网站api的音乐管理软件,它既可以从萌否网站上获取网络上的音乐资源也可以在本地音乐上进行私人化定制管理。 本来只是想写一个 Material Design 风格的客户端练练手而已,后来在写的过程中想要...

    新版Android开发教程.rar

    与 Android Market 联机;支持谷歌 “ 街景 ” 服务;包装盒内附 数据工具包。 更多信息 https://sites.google.com/a/android.com/opensource/release-features Android Android Android Android 盈利模式 Android ...

    Android程序设计基础

    谷歌公司与开放手机联盟合作开发了Android,这个联盟囊括了中国移动、摩托罗拉、高通、宏达和T-Mobile在内的30多家无线应用方面的领头羊。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系...

    Google Android SDK开发范例大全的目录

    5.15 文件资源管理器再进化——JavaI/O修改文件名及删除 5.16 取得目前File与Cache的路径——getCacheDir与getFilesDir 5.17 打开/关闭WiFi服务——WifiManager状态判断 5.18 取得SIM卡内的信息——TelephonyManager...

    毕业设计——网络音乐播放器

    本程序为本人毕业设计《基于Android网络音乐播放器的设计与实现》中的Android客户端程序,此说明简单介绍本程序的各个功能。 一、功能需求分析 本系统为用户主要提供账号模块、推送模块、本地模块、交友模块、搜索...

Global site tag (gtag.js) - Google Analytics