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平台和Java语言开发,其目的在于优化音乐文件的管理并提供在线及离线播放功能。系统具有人性化界面,能够满足用户搜索、分类显示、编辑播放列表以及在线/离线播放音乐的需求。...
虽然无声音乐播放可以提高应用保活,但也会增加电池消耗和系统资源占用。因此,这种策略在实现时需要权衡用户体验和应用保活的必要性。 7. **最佳实践** 为了避免被用户或系统认为是恶意保活,开发者应尽量减少...
本项目“Android音乐播放前台服务”是基于Android Studio实现的,它允许用户在后台或者锁屏状态下继续播放音乐,提高了用户体验。 1. **前台服务的概念** - 前台服务是Android系统中一种特殊的服务类型,它会在...
综上所述,开发一个具备本地和网络播放功能的Android音乐播放器,涉及到了音频处理、媒体库操作、网络流媒体、UI设计、播放控制、服务管理、权限处理、性能优化等多个方面的技术知识点。每个环节都需要细致入微的...
以下是对"Android音乐后台播放(含通知栏操作)"这一主题的详细阐述。 1. **服务(Service)的使用**: 在Android中,为了实现后台播放,我们需要创建一个`Service`。`Service`是Android四大组件之一,它在后台...
8. **下一首和上一首**:切换歌曲通常需要对当前播放的音乐进行判断,如果还有下一首或上一首,就调用`MediaPlayer`的`stop()`方法,释放资源,然后重新初始化并加载新的音乐文件。 9. **文件读写**:对于本地音乐...
综上所述,开发一个Android音乐播放APP涉及了多媒体处理、UI设计、服务、权限管理等多个方面,需要对Android SDK有深入理解。在实际开发过程中,还需要考虑性能优化、错误处理以及兼容性等问题,以提供稳定、流畅的...
在Android平台上,开发一款音乐播放器应用是一项常见的任务,它涉及到多媒体处理、用户界面设计以及与设备硬件的交互等多个方面。本项目是一个基于Android Studio的音乐播放器APP源码,对于学习Android应用开发,...
在Android平台上,开发一个简易本地音乐播放器是一项常见的任务,对于初学者来说是学习Android音频处理和用户界面设计的良好实践。这个"Android简易本地音乐播放器源码"提供了实现这样一个功能的基本框架。以下是对...
在Android平台上开发音乐播放应用是一项常见的任务,而“Android音乐播放源码.zip”提供了一个学习和参考的基础模板。这个压缩包包含了一些关键的文件,帮助我们理解如何在Android上实现音乐播放功能。以下是对这些...
3. **UI设计**:使用Android的布局管理系统(如LinearLayout, RelativeLayout或ConstraintLayout)创建音乐播放器的界面,包括播放/暂停按钮、进度条、歌曲列表等。还需理解XML布局文件的编写和与Java代码的交互。 ...
在Android应用开发中,创建一个能够播放本地音乐的应用是一个常见的需求。这个项目是基于Android Studio构建的,专注于实现播放和暂停本地音乐的功能。在描述中提到,该项目在Android API Level 2.3.2(Gingerbread...
【Android Studio 手机MP3音乐播放器】是一款基于Android Studio开发的应用程序,它允许用户在他们的智能手机上播放MP3格式的音乐文件。这个项目涵盖了Android应用开发的基础知识,包括UI设计、媒体处理、文件操作...
下面,我们将深入探讨“Android音乐播放”这个主题,涵盖描述中提到的音乐控制和音乐列表加载的关键知识点。 1. **多媒体框架(MediaPlayer)**:Android系统提供了`MediaPlayer`类,用于播放音频和视频文件。它是...
首先,"android音乐播放器demo"的核心是音频播放功能。在Android中,我们可以使用`MediaPlayer`类来实现音频的播放。`MediaPlayer`提供了加载音频资源、控制播放状态(如播放、暂停、停止)以及调整音量等方法。例如...
【Android在线音乐播放器】是一个基于Android平台的小型应用程序,旨在提供流媒体音乐播放功能,让用户可以在不下载音乐文件的情况下在线享受音乐。这个项目对于学习Android应用开发,特别是音乐播放功能的实现,...
总的来说,"android音乐播放程序源码"是一个实践性极强的学习资源,对于想要提升Android音频处理能力的开发者来说,是不可多得的参考资料。通过深入研究这个项目,开发者不仅可以掌握Android音乐播放器的实现原理,...
在Android应用开发中,有时我们需要实现播放音频的功能,特别是当音频资源是内嵌在应用程序中的时候。本篇文章将深入探讨如何...通过理解`MediaPlayer`类和音频资源的管理,开发者可以轻松地在应用中集成音乐播放功能。
在Android平台上开发音乐应用时,实现音效和视觉反馈是提升用户体验的重要环节。"android 音乐律动频谱实现"这个项目就是针对这一需求,通过动态显示音乐频谱来增强用户对音频播放的感知。下面我们将深入探讨相关...