`

Android平台的音乐资源管理与播放

 
阅读更多
Android平台基于Linux和开放手机联盟(OHA)系统,经过中国移动的创新研发,设计出拥有新颖独特的用户操作界面,增强了浏览器能力和WAP兼容性,优化了多媒体领域的OpenCORE、浏览器领域的WebKit等业内众多知名引擎,增加了包括游戏、Widget、Java ME等在内的先进平台中间件。本文主要介绍如何利用OPhone平台提供的多媒体编程环境进行音乐资源的管理与播放。
MediaScanner与音乐信息扫描Android系统在SD卡插入后,MediaScanner服务会在后台自动扫描SD上的文件资源,将SD上的音乐媒体信息加入到MediaStore数据库中。程序可以直接从MediaStore中读取相应的媒体信息。通过注册监听下面MediaScanner广播的Intent,可以获知MediaScanner服务是否在进行后台的扫描工作:

l   Intent.ACTION_MEDIA_SCANNER_STARTED:表示MeidaScanner开始扫描;

l   Intent.ACTION_MEDIA_SCANNER_FINISHED:表示MediaScanner扫描结束;

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

1.  启动MediaScanner服务,扫描媒体文件:

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

l   Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件


       public void scanFileAsync(Context ctx, String filePath) {
              Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
              scanIntent.setData(Uri.fromFile(new File(filePath)));
              ctx.sendBroadcast(scanIntent);
       }


l   \"android.intent.action.MEDIA_SCANNER_SCAN_DIR\":扫描指定目录


public static final String ACTION_MEDIA_SCANNER_SCAN_DIR
= \"android.intent.action.MEDIA_SCANNER_SCAN_DIR\";
public void scanDirAsync(Context ctx, String dir) {
              Intent scanIntent = new Intent(ACTION_MEDIA_SCANNER_SCAN_DIR);
              scanIntent.setData(Uri.fromFile(new File(dir)));
              ctx.sendBroadcast(scanIntent);
       }


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



2.  通过MediaScanner提供的API接口,扫描媒体文件。

这种扫描媒体文件的方式是同步的,扫描工作将会阻塞当前的程序进程。当扫描少量文件,且要求立即获取扫描结果的情况下,适合使用该扫描方式。

在扫描媒体文件前,程序应该根据终端当前的语言环境正确设置MediaScanner的语言环境设置, 避免产生编解码的错误:

                  MediaScanner scanner = new MediaScanner(ctx);
                  Locale locale = ctx.getResources().getConfiguration().locale;
String language = locale.getLanguage();
                     String country = locale.getCountry();
scanner.setLocale(language + \"_\" + country);
媒体文件可以存储在手机终端的内存中,也可以存储在SD卡中,Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。真对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。因此在扫描媒体文件时,要明确指明扫描的媒体文件是位于内部存储空间还是外部存储空间,外部存储空间和内部存储空间对应的卷标为“external”和“internal”
               scanner.scanSingleFile(filePath, volumeName, mimeType);
                  scanner.scanDirectories(directories, volumeName);

MediaStore与音乐信息查询MediaScanner将扫描媒体文件获得的信息全部存储在MediaStore数据库中。MediaStore是基于SQLite数据库系统的,通过ContentProvider方式,程序可以对MediaStore数据库进行增删查改等操作。
MediaStore的数据库文件位于/data/data/com.android.providers/databases, 通常可以发现两个数据库文件

l   internal.db:对应内部存储空间的媒体数据库文件;

l    external-xxxxxxxx.db:对应外部存储空间的媒体数据文件,由于同一个手机终端可能使用多个SD卡,针对每一个SD卡,OPhone平台都会生成对应的媒体数据库文件。

两个数据库文件除了管理的文件所存储的位置不同外,没有其他区别。本文后续将默认以外部存储为例进行介绍。
使用SQLite命令打开数据库文件,可以看到Android多媒体数据库的基本结构:
>sqlite3 external-xxx.db
>.tables
>.schema
感兴趣的读者可以自己查看,本文不再一一列举。

MediaStore类是Android平台的多媒体数据库,它包含了音频,视频,图片等所有多媒体文件信息。本文将重点介绍如何管理和获取音频信息,视频和图片等信息的获取与管理与音频类似。
MediaStore以ContentProvider的形式向外提供媒体数据库信息。通过Android平台提供的ContentProvider接口,可以方便的访问数据库信息。
public Cursor query(Contex ctx, Uri _uri, String[] prjs, String selections,
                     String[] selectArgs, String order) {
              ContentResolver resolver = ctx.getContentResolver();
              if (resolver == null) {
                     return null;
              }
              return resolver.query(_uri, prjs, selections, selectArgs, order);
       }


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

l         prjs: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。      

l         selection: 指定查询条件    

l         selectionArgs:参数selection里有?这个符号时,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null

l         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的状态变化:

l   MediaPlayer.OnBufferingUpdateListener

l   MediaPlayer.OnCompletionListener

l   MediaPlayer.OnErrorListener

l   MediaPlayer.OnPreparedListener

l   MediaPlayer.OnSeekCompleteListener


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


l   从资源文件播放

多媒体文件可以放在资源文件夹/res/raw目录下,然后通过MediaPlayer.create(Context ctx, int file)方法创建MediaPlayer对象,获得MediaPlayer对象后直接调用start()方法即可播放音乐。



l   从文件系统播放

从文件系统播放音乐,需要使用new操作符创建MediaPlayer对象。获得MediaPlayer对象之后,需要依次调用setDataSource() 和prepare()方法,以便设置数据源,让播放器完成准备工作,然后调用start()方法播放音乐。



l   从网络播放

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”指定连接端口 (如何建立CMWAP数据连接,获取连接端口名,本文不再详细叙述,请读者查看相关的Android技术文章),下面的程序简单说明了通过代理服务器播放音频资源的步骤:

private void playFromNetwork() {
       String path = \"http://website/path/test.mp3\";
       String CMWAP_HOST = \"10.0.0.172\";
    String CMWAP_PORT = \"80\";

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

    String urlWithProxy = path + \"?x-http-proxy=\" + CMWAP_HOST + \":\" + CMWAP_PORT + \"&\" + \"x-net-interface=\" + SOCKET_INTERFACE ;

       try {
              MediaPlayer player = new MediaPlayer();
              player.setDataSource(path);
              player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                     public void onPrepared(MediaPlayer player) {
                            player.start();
                     }
              });
              player.prepareAsync();
       } catch (Exception e) {
              e.printStackTrace();
       }
}

分享到:
评论

相关推荐

    基于Android平台的音乐播放软件的设计与开发.pdf

    "基于Android平台的音乐播放软件的设计与开发" 本文主要介绍了一款基于Android平台的音乐播放软件的设计与开发过程。该软件能够满足音乐播放、暂停、停止、上一首、下一首、音量调节、歌曲进度调节、歌曲时长显示、...

    基于 android 的Android作业音乐播放器源码(96分以上).zip

    这个音乐播放器应用是一个课程作业项目,实现了在 Android 平台上播放音乐的功能,拥有良好的用户界面设计和音乐管理功能。通过提供源码文件,用户可以学习和理解 Android 开发的相关知识和技术,掌握音乐播放器应用...

    基于Android手机音乐播放器开发与实现.pdf

    Android手机音乐播放器开发与实现是基于Android平台的音乐播放器的设计和开发过程。该音乐播放器可以播放wav、mp3等常见格式的音频文件,同时具备控制音乐的播放、暂停、停止、视觉外观、音量调节、播放列表和文件...

    基于Android平台的手势与语音转换技术.pdf

    基于Android平台的手势与语音转换技术.pdf 概述: 基于Android平台的手势与语音转换技术是将图像识别和语音识别技术结合Android开发,实现了一种基于Android平台的手势与语音转换技术。该技术可以实现手势识别和...

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

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

    基于android平台的手机安全卫士APP设计与实现.pdf

    "基于Android平台的手机安全卫士APP设计与实现" 本文旨在为Android平台设计和实现了一款手机安全卫士APP,旨在保护用户的个人隐私和财产不受侵害。该系统采用MVC架构模型,使用SQLite数据库进行数据管理,并使用...

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

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

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

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

    Android程序设计基础

    但是凭借谷歌公司的强大实力以及与开放手机联盟的通力合作,我们相信Android会越来越好,一定会成为主流的手机操作系统平台。..  本书分为3个部分共10章,最后还有两个附录。第1~3章介绍Android的基础知识和基本...

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

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

    android权限大全

    该权限用于广播sticky intent,例如广播当前的音乐播放状态。这个权限通常用于需要广播事件的应用程序,例如音乐播放器等。 android.permission.CALL_PHONE: 该权限用于访问手机通信,例如拨打电话、发送短信等。...

    基于Android的智能课表的设计与实现.pdf

    本文主要论述了基于Android平台的智能课表应用程序的设计与实现。该应用程序是基于Android SDK和Eclipse集成开发环境进行开发的,实现了手机的添加课表、课表实时提醒、课上手机控制等实用功能,在模拟器和手机上...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

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

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

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

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

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

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

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

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

    基于Android的多媒体应用开发.pdf

    该设计实现的音乐播放器既可以播放资源文件中的音乐文件,也可以选择手机 SD 卡中的本地音乐文件进行播放。 Android 多媒体应用程序开发方法 Android 多媒体应用程序开发可以分为以下几个步骤: 1. 需求分析:...

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

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

Global site tag (gtag.js) - Google Analytics