Android音乐播放器.docx
《Android音乐播放器.docx》由会员分享,可在线阅读,更多相关《Android音乐播放器.docx(28页珍藏版)》请在冰点文库上搜索。
Android音乐播放器
基于安卓的音乐播放器开发
摘要
智能手机在现代生活中是不可或缺的一部分,由于智能手机的快速发展,且随着越来越多的人使用智能手机,人们对手机功能的要求也越来越高,当然,娱乐功能必不可少,其中使用频率最高的就是音乐播放功能了。
基于安卓的音乐播放器有在线及本地音乐播放功能,收藏歌单,同时也包括播放、暂停、上一首、下一首、歌词滚动播出等播放控制功能。
本课题介绍了安卓平台以及SQLite数据库的相关用法,并通过AndroidStudio进行安卓程序开发。
【关键词】AndroidSQLite
1.绪论
我们每天都在玩手机,听音乐。
这学期我们学习了Java这门强大的语言。
通过Java,我们可以编写出手机应用程序。
不满足于书本上的那点知识,同时对安卓程序开发比较感兴趣,我们小组决定开发出一款手机上的音乐播放器。
虽然我们才学Java,对安卓一无所知,但是我们仍然决定自学安卓,完成本次课程设计。
这样我们一方面可以掌握一些安卓技术,一方面可以加深我们的Java实力,同时也是锻炼我们自学能力的一个的机会。
2.背景
1.1应用背景
手机是人们日常生活中不可或缺的一部分。
在科技发达的今天,大部分人都拥有一部安卓手机。
在手机上播放音乐,方便快捷,随时随地可以享受音乐的美妙。
为此,本小组开发了一款安卓平台音乐播放器,不仅可以搜索本地音乐进行播放,还可以联网搜索音乐,想听什么,就听什么。
1.2技术背景
1.2.1安卓平台JAVA应用程序设计
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。
主要用JAVA语言来开发Android平台程序。
Android平台由四部分组件构成:
Activity,Service,Broadcast,ContentProvider。
1.2.2SQLite数据库
SQLite是一款轻型的数据库,遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。
它是D.RichardHipp建立的公有领域项目。
由于它占用的资源非常少,所以在嵌入式设备中得到了广泛的应用。
1.2.3Jsoup网络爬虫
Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。
它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
1.3工具
本项目使用Jsoup抓取虾米音乐API以及在线搜索结果,使用SQLite数据库中存储本地数据,利用Google官方IDEAndroidStudio实现项目的开发。
1.4任务分工
1)查阅资料,选择设计题目:
张建升,姚丹,聂诗一起讨论
2)程序总体设计、详细设计:
张建升,姚丹,聂诗一起讨论
3)程序模块代码编写、调试、测试:
张建升负责事件编写,姚丹、聂诗负责界面设计,素材获取。
4)撰写课程设计任务和课程设计报告:
张建升,姚丹,聂诗一起讨论
5)上台演讲:
张建升
3.需求分析
3.1需求概述
本项目为安卓平台音乐播放器,包括在线音乐搜索、本地音乐查看、音乐播放、音乐收藏、歌曲信息显示、播放控制,歌词显示等功能。
3.2项目功能描述
3.2.1在线音乐搜索
3.2.2本地音乐查看
3.2.3音乐播放
3.2.4音乐收藏
3.2.5歌曲信息显示
3.2.6播放控制
3.2.7歌词显示
本系统主要实现安卓平台音乐播放功能,其需要实现的具体功能如下:
●音乐基本播放控制,包括播放,暂停,上一曲,下一曲;
●播放模式:
单曲循环,列表循环,随机播放;
●音乐的后台播放(利用Service);
●查看实时播放列表,音乐收藏列表;
●本地音乐检索,播放;
●在线音乐搜索,播放,歌词下载;
●歌词滚动显示。
4.界面设计
3.2项目功能概述
本项目由三个Activity组成:
●欢迎界面Spalish.java
●主界面Main.java
●播放器界面Player.java
3.2.1欢迎界面设计
用户刚进入该软件时显示的欢迎信息。
3.2.2主界面设计
主界面包含三个子界面(Fragment)
●在线音乐搜索界面Search_fragment.java
●本地音乐查看界面LocalMusic_fragment.java
●收藏音乐查看界面LoveMusic_fragment.java
3.2.3播放器界面设计
播放器界面包含歌曲名,歌手名等信息显示,以及播放控制(包括播放,暂停,上一曲,下一曲),歌词显示等功能。
5.功能设计
5.1SQLite数据库设计
Android系统自带一个MusicStore封闭类专门来存储媒体信息通过Uri EXTERNAL_CONTENT_URI 来访问SDcard中的媒体资源信息,并自动以SQLite数据库的形式存放在手机中。
其表结构如图4.1所示:
属性
数据类型
允许空
主键
_id
INTEGER
Notnull
Primarykey
_data
TEXT
Notnull
_display_name
TEXT
_size
INTEGER
title
TEXT
duration
INTEGER
artist
图4.1
另外定义了两个用户数据库,一个保存当前播放的歌曲列表(musicplaylist.db),一个保存用户收藏的歌曲列表(musiclovelist.db),其表结构如图4.2所示:
属性
数据类型
允许空
主键
musicid
INTEGER
Notnull
musicurl
TEXT
Notnull
musicname
TEXT
albumurl
TEXT
Notnull
lrcurl
TEXT
artistname
TEXT
islocal
BOOLEAN
Notnull
图4.2
5.2主界面设计
主界面包含三部分,标题栏,中间栏和底栏,如图4.3所示:
图4.3
4.2.1主界面切换
主界面包含三个Fragment,因此要进行三个Fragment之间的切换。
在标题栏栏添加三个ImageView,分别添加监听事件对应三个Fragment,从左至右依次为在线音乐搜索界面,本地音乐查看界面,收藏音乐查看界面,并用FragmentManager完成Fragment的切换。
Fragment的切换在中间栏完成。
即切换Fragment只改变中间栏的内容。
4.2.2在线音乐搜索界面设计
在线音乐搜索界面包括一个TextView,一个EditText,一个Button和一个ListView,TextView显示当前界面为在线音乐搜索界面。
当用户在EditText中输入输入需要搜索的歌曲时,点击按钮,后台完成搜索后,把结果显示在ListView中。
4.2.3本地音乐查看界面设计
本地音乐查看界面包括一个TextView显示当前界面为本地音乐查看界面,一个ListView,在完成本地音乐数据库的读取之后,把结果显示在ListView中。
4.2.4收藏音乐查看界面设计
收藏音乐查看界面包括一个TextView显示当前界面为收藏音乐查看界面,一个ListView,在完成收藏音乐数据库的读取之后,把结果显示在ListView中。
4.2.5迷你播放器设计
在主界面的底栏设计有一个迷你播放器视图,通过这个小播放器可以实现专辑封面,当前播放音乐名,歌手名信息的查看,并在右侧有三个按钮,分别为查看当前播放列表,播放/暂停,下一曲。
在点击迷你播放器其他位置时,跳转到播放器界面。
4.2.6自定义Adapter设计
在使用ListView时,需要自定义漂亮的Adapter,也就是ListView每一行所显示的内容,自定义Adapter如图4.4所示:
图4.4
包括一个ImageView显示专辑图片,两个TextView显示歌曲名和歌手,还有个ImageView添加点击事件,显示弹出式菜单。
在弹出式菜单中有下一曲播放,收藏等功能。
直接点击歌曲名附近时,可以立即播放当前的歌曲。
5.3播放器界面设计
播放器界面包括四部分,依次为标题栏,歌词显示栏,进度条栏,播放控制栏如图4.4所示:
图4.5
4.3.1标题栏
标题栏有两个Button和两个TextView,左侧按钮用于返回主界面,右侧按钮用于收藏当前歌曲。
两个TextView用来显示当前播放的歌曲名和歌手名。
4.3.2歌词显示栏
在播放音乐时,联网搜索当前歌曲的歌词信息,如果找到了歌词,就加载到内存,经过了格式化之后,显示到歌词View上。
并提供有实时滚动功能。
4.3.3进度条栏
获取当前播放歌曲的信息,包括已经播放的时间和总时间,在左侧TextView显示已播放时间,在右侧TextView显示剩余时间,中间进度条显示播放的进度,实时更新。
4.3.4播放控制栏
播放控制栏包括5个ImageView,添加监听事件从左到右分别实现:
1)播放模式控制,包括单曲循环,列表循环,随机播放
2)上一曲
3)播放/暂停
4)下一曲
5)查看播放列表
5.4播放列表设计
无论是在主界面还是在播放器界面,均提供了查看播放列表功能,
5.5音乐播放设计
为了实现后台播放,本应用使用安卓的Service组件来完成后台音乐播放。
安卓提供了MediaPlayer类,可以方便地播放各种音乐,只需要提供文件路径或者网络地址。
因此,设计把MediaPlayer实例放在Service中,并在Service中提供控制MediaPlayer的各种方法,例如Play,Pause,Continue,PreMusic,NextMusic等。
4.5系统功能表和系统功能结构图
功能类别
子功能
子功能
主界面
切换fragment
切换到网络音乐搜索界面
切换到本地音乐查看界面
切换到收藏音乐查看界面
跳转到播放器界面
查看播放列表
返回播放器界面
切换歌曲
删除歌曲
播放/暂停
调用Service方法播放或暂停
下一首
播放列表索引变化->寻找下一ID歌曲
播放器界面
跳转到主界面
播放/暂停
调用Service方法播放或暂停
上一首
播放列表索引变化->寻找上一ID歌曲
下一首
播放列表索引变化->寻找下一ID歌曲
播放模式
切换3种播放模式
查看播放列表
返回播放器界面
切换歌曲
删除歌曲
图4.5
图4.6
6.具体实现
5.1音乐存储
3.1.1音乐类
音乐类Music.java,存储了一首音乐的完整信息,包含以下变量,以及各变量的get,set方法:
privateStringmusicName;//歌曲名
privateStringmusicURL;//歌曲URL,本地歌曲为目录
privateStringmusicId;//在线歌曲ID
privateStringalbumName;//专辑名
privateStringsAlbumURL;//专辑封面
privateStringlrcURL;//歌词URL
privateStringartistName;//歌手名
privatebooleanisLocal;//是否为本地歌曲
3.1.2音乐播放列表
播放列表类MusicPlayList.java:
播放列表包含ArrayListmusicList存储的播放歌曲列表,当前播放歌曲的下标intcurrentindex,以及增加音乐insertmusic等方法。
此类为全局变量,安卓中全局变量需要继承Application,并在AndroidManifest.xml中注册该类名。
这样,就可以在该应用的任何地方获取到音乐播放列表。
在程序退出时,将该类存储的歌曲存储到SQLite数据库中的musicplaylist表中。
再次打开程序时,从数据库中读取音乐保存到播放列表类,这样就实现了播放列表的存储。
3.1.3音乐收藏列表
音乐收藏列表类:
MusicStore.java:
本应用提供音乐收藏功能,收藏的音乐保存在SQLite数据库中,在此类中提供了判断一首歌曲是否被收藏的isLovedMusic,以及新增收藏addLovedMusic,取消收藏removeLovedMusic的方法。
5.2音乐获取
本应用既可以在线搜索喜爱的歌曲,也可以列出本地已下载的歌曲。
5.2.1网络音乐获取
本应用核心功能为在线音乐搜索及播放,因此获取音乐的API最为重要。
因为音乐的版权问题,目前各大音乐服务商均未公开其官方音乐API,通过查找相关资料,找到了虾米音乐相关的API,其实现在GetInformation.java中。
●音乐搜索
定义基本信息搜索字符串:
publicstaticStringKEY_SEARCH_URL="";
在后面加上要搜索音乐的名字,例如“TryEverything”,访问即可得到如下图所示结果:
如图3.1所示,虾米音乐搜索结果:
图5.1
其每一行结果的Html代码如下(已略去无关信息):
Try
Everything
MichaelGiacchino(Shakira)
《Zootopia(OriginalMotionPictureSoundtrack)》
|
图5.2
通过使用Jsoup,可以抓取到:
音乐ID:
1775595262,
音乐名称:
TryEverything,
歌手:
MichaelGiacchino(Shakira),
专辑名:
《Zootopia(OriginalMotionPictureSoundtrack)》。
通过抓取整个网页的信息,即可完成音乐基本信息的在线搜索。
核心代码如下:
publicstaticArrayListgetShortInformation(Stringinput)
{
ArrayListmusics=newArrayList();
Document=null;
try
{
document=Jsoup.connect(KEY_SEARCH_URL+deCodeKey(input)).get();//jsoup连接最终拼接而成的请求字符串
Elementselements1=document.getElementsByClass("chkbox");//选择标签
Elementselements2=document.getElementsByClass("song_name");
Elementselements3=document.getElementsByClass("song_artist");
Elementselements4=document.getElementsByClass("song_album");
for(inti=0;i{
Musictemp=newMusic();
temp.setMusicId(elements1.get(i).select("input").attr("value"));
temp.setMusicName(elements2.get(i).select("a").text());
temp.setArtistName(elements3.get(i).select("a").text());
temp.setAlbumName(elements4.get(i).select("a").text());
if(!
elements1.get(i).select("input").attr("disabled").equals("disable"))
musics.add(temp);
}
if(musics.size()>1)
musics.remove(0);
}catch(IOExceptione)
{
e.printStackTrace();
}
returnmusics;
}
图5.3
●音乐解析
通过已经抓取到的音乐基本信息,根据用户的需要,可进行详细信息的搜索。
当用户指定某首歌曲时,通过音乐ID可以查询音乐的详细信息。
先定义详细信息搜索字符串:
publicstaticStringID_SEARCH_URL="";
在后面加上需要搜索的音乐ID,例如1775595162,访问此网页可得到如下图所示信息:
图5.4
通过此页面可以得到完整的信息:
●专辑封面URL:
●下载地址(已加密,每天都会改变)
5h3%..i%5F6%%E72566E_3ue29E696%f4%E-tA2fx.2E6%252%F529%h%tyd332f35-55-nt%FiicF1%5FE7519_65.3h%4dc3f7E16E%up2mlao6%5E2%1E755%EmF_3b%586c746%5l%F6emm%2E1156%72954pakDc5f52bb645El
●歌词URL
通过对下载地址的解密,得到真实下载地址:
http:
//m6.2d4bc93d03c5f623859ff62637cb07bf-1464566400-0-null
其核心代码如下:
publicstaticMusicgetAllInformation(Musicmusic)
{
StringpostUrl=ID_SEARCH_URL+music.getMusicId();
try
{
Documentd=Jsoup.connect(postUrl).get();//连接相应ID的接口地址
Elementselement=d.select("trackList");
for(Elemente:
element)
{
music.setsAlbumURL(e.select("pic").text());
music.setbAlbumURL(e.select("album_pic").text());
music.setLrcURL(e.select("lyric").text());
music.setMusicURL(DecodeMusicURL.decodeMusicUrl(e.select("location").text()));
}
}catch(IOExceptione)
{
e.printStackTrace();
}
returnmusic;
}
图5.5
至此,本应用的网络音乐搜索功能已经实现。
5.2.2本地音乐检索
在安卓系统中,获取音乐信息不需要进行全盘搜索,利用ContentResolver可以获取安卓系统四大组件之一ContentProvider提供的联系人,图片,音频,视频文件。
在本应用中,定义了LocalMusicStore.java,定义了静态的getMusicList方法,利用ContentResolver查询了如下URI:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
查询如下四项内容:
MediaStore.Audio.Media.TITLE歌曲名
MediaStore.Audio.Media.ARTIST歌手名
MediaStore.Audio.Media.ALBUM专辑名
MediaStore.Audio.Media.DATA文件路径
并返回Music类型的ArrayList的数组,当要使用本地音乐时,直接调用此方法即可获取。
至此,本应用完成了本地音乐的检索。
5.3音乐播放
5.3.1接口定义
为了实现音乐播放Service返回信息到Activity,定义两个自定义接口,使用接口回调方法实现Service与Activity的通信。
publicinterfaceOnLoadInformationListener
{
voidonLoadInfrometion(StringMusicName,
StringArtistName,
StringLyricUrl,
StringAlbumPic,
booleanisPlaying,
booleanisContinue,
booleanisLoveMusic);
}
图5.6
OnLoadInformationListener包含需要在主界面显示的各种信息,通过此接口回调可以更新界面。
publicinterfaceOnProgressListener
{
voidonProgress(intprogress,intfulltime);
}
图5.7
OnProgressListener实现播放界面进度条信息更新,包含progress变量表示当前进度,fulltime表示歌曲总长度。
5.3.2音乐播放类
音乐播放类:
MusicPlayService.java
本应用设计需在后台播放音乐,在Android系统中,提供了Service(服务)来完成后台任务,并在程序最小化时保持运行。
在Service中,定义了MediaPlayer实例,使用MediaPlayer来播放音乐。
定义了播放控制函数,包括播放,暂停,上一曲,下一曲等。
图5.8
继承了OnCompletionListener接口,在一首音乐播放完成后,实现播放模式的控制(单曲,循环,随机)。
publicvoidonCompletion(MediaPlayermp)
{
if(musicPlayList.getNextIndex()!
=-1)
{
startPlay(musicPlayList.getNextIndex());
musicPlayList.setNextIndex(-1);
return;
}
switch(playMode)
{