OPhone程序开发入门之音乐播放器Word文件下载.docx
《OPhone程序开发入门之音乐播放器Word文件下载.docx》由会员分享,可在线阅读,更多相关《OPhone程序开发入门之音乐播放器Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
同时MediaProvider,MediaScanner等系统服务也对媒体文件的管理提供了支持。
本文将重点介绍它们的使用。
3.第三层是Library层,它由一系列的c/c++库组成,这些库的能力通过JNI封装成java接口,由ApplicationFramework层提供给开发者。
多媒体系统库OpenCore,它是OPhone多媒体的核心,来源于PacketVideo。
它非常复杂,提供了完整的多媒体解决方案。
4.最底层为LinuxKernel和驱动,负责与硬件的数据交互等。
图二说明了在OPhone平台中播放音乐文件时的调用关系。
对于应用程序开发者来说,需要重点学习和关注的是如何使用AppliationFramework层提供给开发者的接口。
音乐媒体信息的管理
在开始构架程序之前,我们需要准备一下必须的基本知识。
首先来了解一下在OPhone平台中应该如何获取音乐文件的信息以及如何管理这些信息。
OPhone系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过ContentProvider的方式提供给用户。
当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中。
在这个程序中,我们不需要关心如何去扫描手机中的文件,只要了解如何查询和使用这些信息就可以了。
MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息。
下面我们重点介绍如何管理SD卡上的音乐文件信息。
先来了解一下ContentResolver的查询接口:
viewplaincopytoclipboardprint?
1.Cursor
query(Uri
uri,
String[]
projection,
String
selection,
selectionArgs,
sortOrder);
Cursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder);
Uri:
指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档。
Projection:
指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。
Null则返回所有信息。
selection:
指定查询条件
selectionArgs:
参数selection里有?
这个符号是,这里可以以实际值代替这个问号。
如果selection这个没有?
的话,那么这个String数组可以为null。
SortOrder:
指定查询结果的排列顺序
查询所有歌曲:
cursor
=
query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
Cursorcursor=query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
该命令将返回所有在外部存储卡上的音乐文件的信息,其中常用的信息如下:
1.MediaStore.Audio.Media._ID:
歌曲ID
Int
id
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
MediaStore.Audio.Media.TITLE:
歌曲的名称
tilte
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
MediaStore.Audio.Media.ALBUM
:
歌曲的专辑名
album
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
MediaStore.Audio.Media.ARTIST:
歌曲的歌手名
artist
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
MediaStore.Audio.Media.DATA:
歌曲文件的路径
url
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
MediaStore.Audio.Media.DURATION:
歌曲的总播放时长
duration
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
MediaStore.Audio.Media.SIZE:
歌曲文件的大小
size
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
MediaStore.Audio.Media._ID:
歌曲IDIntid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
MediaStore.Audio.Media.TITLE:
歌曲的名称Stringtilte=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
MediaStore.Audio.Media.ALBUM:
歌曲的专辑名Stringalbum=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
MediaStore.Audio.Media.ARTIST:
歌曲的歌手名Stringartist=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
MediaStore.Audio.Media.DATA:
歌曲文件的路径Stringurl=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
MediaStore.Audio.Media.DURATION:
歌曲的总播放时长Intduration=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
MediaStore.Audio.Media.SIZE:
歌曲文件的大小Intsize=cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
查询歌手信息:
query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
MediaStore.Audio.Artists.DEFAULT_SORT_ORDER);
Cursorcursor=query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Artists.DEFAULT_SORT_ORDER);
该命令将返回所有在外部存储卡上的歌手信息,其中常用的信息如下:
1.MediaStore.Audio.Artists._ID:
歌手id
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
MediaStore.Audio.Artists.ARTIST
歌手姓名
name
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
MediaStore.Audio.Artists.NUMBER_OF_ALBUMS:
共有多少该歌手的专辑
numOfAlbum
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS));
MediaStore.Audio.Artists.NUMBER_OF_TRACKS:
共有多少该歌手的歌曲
numOfSong
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS));
MediaStore.Audio.Artists._ID:
歌手idIntid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
MediaStore.Audio.Artists.ARTIST:
歌手姓名Stringname=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
MediaStore.Audio.Artists.NUMBER_OF_ALBUMS:
共有多少该歌手的专辑IntnumOfAlbum=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_ALBUMS));
MediaStore.Audio.Artists.NUMBER_OF_TRACKS:
共有多少该歌手的歌曲IntnumOfSong=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.NUMBER_OF_TRACKS));
查询专辑信息:
query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
null,null,
MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
Cursorcursor=query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
该命令将返回所有在外部存储卡上的专辑信息,其中常用的信息如下:
1.MediaStore.Audio.Albums._ID
专辑id
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
MediaStore.Audio.Albums.ALBUM:
专辑名称
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
MediaStore.Audio.Albums.NUMBER_OF_SONGS:
共用多少歌曲属于该专辑
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
MediaStore.Audio.Albums._ID:
专辑idIntid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
MediaStore.Audio.Albums.ALBUM:
专辑名称Stringname=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
MediaStore.Audio.Albums.NUMBER_OF_SONGS:
共用多少歌曲属于该专辑IntnumOfSong=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
查询播放列表
query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
MediaStore.Audio.Playlists.DATE_ADDED
+
"
asc"
);
Cursorcursor=query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Playlists.DATE_ADDED+"
asc"
该命令将返回所有在外部存储卡上的专辑信息,其中常用的信息如下:
1.MediaStore.Audio.Playlists._ID
播放列表id
cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists._ID));
MediaStore.Audio.Playlists.NAME:
播放列表名称
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.NAME));
添加时间
long
dateAdded
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.DATE_ADDED));
MediaStore.Audio.Playlists.DATE_MODIFIED
修改时间
dateModified
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.DATE_MODIFIED));
MediaStore.Audio.Playlists._ID:
播放列表idIntid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists._ID));
MediaStore.Audio.Playlists.NAME:
播放列表名称Stringname=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.NAME));
MediaStore.Audio.Playlists.DATE_ADDED:
添加时间longdateAdded=cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.DATE_ADDED));
MediaStore.Audio.Playlists.DATE_MODIFIED:
修改时间longdateModified=cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Playlists.DATE_MODIFIED));
通过组合这些查询结果,指定查询条件,用户可以很方便的查询指定的媒体信息,比如:
查询属于指定歌手(歌手id为aid)的歌曲:
1.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
MediaStore.Audio.Media.ARTIST_ID
="
aid,
MediaStore.Audio.Media.TITLE);
query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,MediaStore.Audio.Media.ARTIST_ID+"
+aid,null,MediaStore.Audio.Media.TITLE);
查询属于指定专辑(专辑id为aid)的歌曲:
1.return
MediaStore.Audio.Media.ALBUM_ID
returnquery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,MediaStore.Audio.Media.ALBUM_ID+"
以上我们重点介绍了音乐媒体信息的查询方法,对于媒体信息的增删改等操作主要集中在对播放列表的管理上,也是通过ContentResolver的insert,update,delete等接口来实现的。
只要搞清楚了各个参数的含义,相应URI以及各个字段的义,很容易实现。
由于篇幅原因,我们不再详细介绍,有兴趣的朋友可以查看OPhone开发文档。
音乐播放
音乐文件的播放功能是由MediaPlayer类实现的,MediaPlayer提供了常用的接口,比如播放,暂停,停止,快速定位等。
播放音乐文件的基本调用流程:
1.生成MediaPlayer实例。
2.设置播放源(文件)
3.准备播放
4.开始播放
1.MediaPlayer
mp
new
MediaPlayer();
mp.setDataSource(file_to_play);
mp.prepare();
mp.start();
MediaPlayermp=newMediaPlayer();
mp.setDataSource(file_to_play);
mp.prepare();
mp.start();
以上代码即可以完成最简单的音乐播放功能。
除了MediaPlayer类,我们还需要注意几个播放器件Listener的使用,它们提供了播放器的更多的状态信息。
1.MediaPlayer.OnBufferingUpdateListener
当播放网络上的媒体文件或者流媒体时
MediaPlayer.OnBufferingUpdateListener的onBufferingUpdate(MediaPlayermp,intpercent)接口函数会被回调,通知当前的缓冲进度