安卓音乐播放器开发含源代码.docx
《安卓音乐播放器开发含源代码.docx》由会员分享,可在线阅读,更多相关《安卓音乐播放器开发含源代码.docx(57页珍藏版)》请在冰豆网上搜索。
安卓音乐播放器开发含源代码
基于android平台的音乐播放器开发
实验报告
学生姓名:
温从林
学号:
班级:
计自1201
第一章引言
1.1项目背景
当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Windowsmobile,symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。
那么能否在手机上拥有自己编写的个性音乐播放器呢?
能的,谷歌Android系统就能做到。
本文的音乐播放器就是基于谷歌Android手机平台的播放器。
Android:
是谷歌于2007年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。
这使得越来越多的人关注这个操作系统。
本次作品音乐播放器就是基于Android平台的。
1.2编写目的
现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计实现的主要功能是播放Mp3Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,播放列等基本播放控制功能,界面简明,操作简单。
本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的
多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。
使人们的生活更加多样化。
也使设计者更加熟练Android的
技术和其它在市场上的特点。
1.3开发环境
Eclipse、AndroidSDK320
第二章系统需求分析
2.1功能需求(用例图分析)
根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。
以下分别描述:
2.1.1播放器的用例图
假设安装了音乐播放器的用户是系统的主要设计对象,其拥有以下操作,
启动软件、播放音乐、暂停播放、停止播放、退出软件,其用例图如下
图2.1播放器基本用例图
2.1.2用例分析
前置条件:
无
基本事件流:
1.用户启动软件
2.播放器将播放列表中的当前的歌曲
用例名称:
播放
参与者:
用户
目标:
使得用户可以播放在播放列表中选中的歌曲
前置条件:
播放器正在运行
基本事件流:
1.用户单击“播放”按钮
2.播放器将播放列表中的当前的歌曲
用例名称:
暂停
参与者:
用户
目标:
使得用户可以暂停正在播放的歌曲
前置条件:
歌曲正在播放且未停止和暂停
基本事件流:
1.用户单击“暂停”按钮
2.播放器将暂停当前的歌曲
用例名称:
停止
参与者:
用户
目标:
使得用户可以停止正在播放的歌曲
前置条件:
歌曲正在播放或暂停
基本事件流:
1.用户单击“停止”按钮
2.播放器将停止当前播放的歌曲
用例名称:
退出
参与者:
用户
目标:
使得用户退出或者后台播放音乐
前置条件:
程序在运行
基本事件流:
1.用户按返回键
2.播放器退出或者进入后台播放
第三章概要设计
3.1软件播放流程图
Stepl.启动软件后,软件自动检索手机和sd卡的音频文件,并组织显示成列表
Step2.点击列表的歌曲名字。
Step3.播放音乐。
Step4.点击暂停,音乐暂停
Step5.点击播放转到step3
Step6.点击停止停止播放音乐
Step7.点击退出。
启动软件
自动检索手机中
暂停/退出软件
图3.1音乐播放器流
第四章界面展示
4.1软件部署
系统编译生成apk文件,将apk文件拷到手机或者sd卡中,直接打幵即可安装。
4.2启动软件
打幵软件后的界面
4.3歌曲列表界面
歌曲列表界面
4.4播放界面
4.5收藏界面
4.6在线搜索音乐界面
第五章结论
(1)通过本次幵发解决了诸如SD卡音乐文件搜索并显示、联网搜索歌曲等
难题,对安卓的幵发有了更深入的认识。
(2)通过对Android手机平台的音乐播放器软件的开发,使我对Android音乐播
放器系统的整体设计有一个深入的了解,对整个流程也会有一个清晰的认识。
开发
Android音乐播放器,要抓住开发的核心部分,音乐播放器大体由播放主界面、播放列表、菜单、播放设置、文件浏览、歌曲搜索六大核心组成。
(3)本次程序设计,对播放器的系统结构框架做了精心的构思与设计,采用主要
开发工具是Eclips4.0+Java语言的支持,AndroidDevelopmentTool的插件,和
AndroidSDK2.1版本的全面结合,才使整个音乐播放器系统得以实现
第五章部分源代码
以下给出功能实现代码,布局,风格等代码量过大,放在压缩文件中
MainActivity.java:
package
import
import
import
import
import
import
import
import
import
import
publicclassMainActivityextendsActionBarActivity{
@Override
protectedvoidonCreate(BundlesavedlnstanceState){
super.onCreate(savedlnstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.fragment_main);
Threadthread=newThread(){
publicvoidrun(){
try{
sleep(2500);
}catch(InterruptedExceptione){
e.printStackTrace();
}
finish();
Intentintent=newIntent(MainActivity.this,MusicActivity.class);
startActivity(intent);
}
};
thread.start();
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenulnflater().inflate(R.menu.main,menu);
returntrue;
}
@Override
publicbooleanonOptionsltemSelected(Menultemitem){
//Handleactionbaritemclickshere.Theactionbarwill//automaticallyhandleclicksontheHome/Upbutton,solong
//asyouspecifyaparentactivityinAndroidManifest.xml.
intid=item.getltemld();
if(id==R.id.action_settings){
returntrue;
}
returnsuper.onOptionsltemSelected(item);
}
*Aplaceholderfragmentcontainingasimpleview.
*/
publicstaticclassPlaceholderFragmentextendsFragment{
publicPlaceholderFragment。
{
}
@Override
publicViewonCreateView(Layoutlnflaterinflater,ViewGroupcontainer,
BundlesavedlnstanceState){
container,
ViewrootView=inflater.inflate(R.layout.fragment_main
false);
returnrootView;
}
}
}
BandanActivity.java
package;
import
import
import
import
import
import
import
import
import
import
import
import
publicclassBangdanActivity
import
private
ListView
listview;
private
String
musicpath;
private
int_ids[];
//
存放音乐文件的id数组
private
String
_titles[];
//
存放音乐文件的标题数组
private
String
_artists[];
//
存放音乐艺术家的标题数组
private
String[]
_path;
//
存放音乐路径的标题数组
private
String[]
_times;
//
存放总时间的标题数组
private
String[]
_album;
//
存放专辑的标题数组
private
int_sizes[];
//
存放文件大小的标题数组
private
String[]
_displayname
;//存放名称的标题数组
@Override
protected
void
onCreate(BundlesavedInstanceState){
extendsActivity{
super.onCreate(savedInstanceState);
setContentView(R.1ayout.bangdanmusic_list);
);
listview=(ListView)findViewByld(R.id.bangdan_music_list
listview.setOnltemClickListener(newMusicListOnClickListener());
ShowMp3List();
}
*显示MP3言息,其中」ds保存了所有音乐文件的_ID,用来确定到底要播放哪一首歌曲,_titles存放音乐名,用来显示在播放界面,
*而_path存放音乐文件的路径(删除文件时会用到)*/
privatevoidShowMp3List(){
//用游标查找媒体详细信息
_titles=newString[cursor.getCount()];
_artists=newString[cursor.getCount()];
_path=newString[cursor.getCount()];
_album=newString[cursor.getCount()];
_times=newString[cursor.getCount()];
_displayname=newString[cursor.getCount()];
_sizes=newint[cursor.getCount()];
到的内容格式为/mnt/sdcard/[子文件夹名/]音乐文件名,而我们想要得到
的是/sdcard/[子文件夹名]音乐文件名
*/
for(inti=0;i_ids[i]=cursor.getInt(3);
_titles[i]=cursor.getString(0);
_artists[i]=cursor.getString
(2);
_path[i]=cursor.getString(5).substring(4);
/*****以下是为提供音乐详细信息而生成的******/
_album[i]=cursor.getString(7);
_times[i]=toTime(cursor.getInt
(1));
_sizes[i]=cursor.getInt(8);
_displayname[i]=cursor.getString(4);
cursor.moveToNext();
}
listview.setAdapter(newMusicListAdapter(this,cursor));
}
/**时间的转换*/
publicStringtoTime(inttime){
time/=1000;
intminute=time/60;
intsecond=time%60;
minute%=60;
/**返回结果用string的format方法把时间转换成字符类型**/
returnString.format("%02d:
%02d",minute,second);
}
/**音乐列表添加监听器,点击之后播放音乐*/
publicclassMusicListOnClickListenerimplementsOnItemClickListener{
@Override
publicvoidonltemClick(AdapterView
>argO,Viewview,intposition,
longid){
musicpath="/mnt"+_path[position];
playMusic(musicpath);
/*putExtraMusic(position);*/
Intentintent=newIntent(BangdanActivity.this
PlayMusicActivity.class);
startActivity(intent);
finish();
}
publicvoidplayMusic(Stringmusicpath){
try{
MediaPlayermp=newMediaPlayer();mp.reset();
mp.setDataSource(musicpath);
mp.prepare();
mp.start();
}catch(Exceptione){
无法播放此文件
new
Toast.makeText(getApplicationContext(),Toast.LENGTH_SHOR)Tshow();
}
}
publicvoidputExtraMusic(intposition){
Intentintent
Intent(BangdanActivity.this,PlayMusicActivity.class);
/*intent.putExtra("_ids",_ids);
intent.putExtra("_path",_path);
intent.putExtra("_titles",_titles);
intent.putExtra("_artists",_artists);
intent.putExtra("position",position);
startActivity(intent);
finish();*/
intent=newIntent();
Bundlebundle=newBundle();
bundle.putlnt("position",25);
intent.putExtras(bundle);
intent.setClass(BangdanActivity.this,PlayMusicActivity.class);
startActivity(intent);
finish();
}
@Override
protectedvoidonStop(){
super.onStop();
}
privatelongexitTime=0;
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK&&event.getAction()
KeyEvent.ACTION_DOWN
if((System.currentTimeMillis()-exitTime)>2000){
Toast.makeText(getApplicationContext(),"再按一次退出程序
Toast.LENGTH_SHOR)Tshow();
exitTime=System.currentTimeMillis();
else{
finish();
System.exit(0);
}
returntrue;
}
returnsuper.onKeyDown(keyCode,event);
}
}
CollectionActivity.java
publicclassCollectionActivityextendsExpandableListActivity{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//一级条目
ListvMapvString,String»groups二new
ArrayListvMapvString,String>>();
MapvString,String〉group1=newHashMapvString,String>();
group1.put("group","【歌手】”);
MapvString,String〉group2二newHashMapvString,String>();
group2.put("group","【专辑】");
groups.add(groupl);
groups.add(group2);
//二组条目
List>>childs二new
ArrayList>>();
//第一组二级科目数据
ListvMapvString,String>>
ArrayListvMapvString,String>>();
MapvString,String〉item1=newHashMapvString,String>();
item1.put("child","林俊杰");
MapvString,String〉item2二newHashMapvString,String>();
item2.put("child","周杰伦");
childl.add(iteml);
child1.add(item2);
//第二组二级科目数据
ListvMapvString,String>>
ArrayListvMapvString,String>>();
MapvString,String〉item3二newHashMapvString,String>();
item3.put("child","vv因你而在>>");
MapvString,String〉item4二newHashMapvString,String>();
item4.put("child","vv流行主教>>");
MapvString,String〉item5二newHashMapvString,String>();
item5.put("child","vv第二天堂>>");
child2.add(item3);
child2.add(item4);
child2.add(item5);
childl二new
child2二new
childs.add(childl);
构造函数参数
childs.add(child2);
//SimpleExpandableListAdapter
〃1.content
//2.一级条目数据
〃3.—级条目布局文件
//4.一级条目Key
〃5.—级条目显示信息控件id
〃6.二级条目数据
〃7.二级条目布局文件
〃8.二级条目Key
〃9.二级条目显示信息控件id
setListAdapter(adapter);
}
privatelongexitTime=0;
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK&&event.getAction()
KeyEvent.ACTION_DOWN){
if((System.currentTimeMillis()-exitTime)>2000){
Toast.makeText(getApplicationContext(),"再按一次退出程
序",Toast.LENGTH_SHORT).show();
exitTime=System.currentTimeMillis();
}
else{finish();
System.exit(O);
}
returntrue;
}
returnsuper.onKeyDown(keyCode,event);
}
*初始化菜单
*/
publicbooleanonMenuKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_MENU&&event.getAction()=
KeyEvent.ACTION_DOWN){
Toast.makeText(getApplicat