音乐播放器设计文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

生产实习报告
题目:音乐播放器
学生姓名:张凡
学号: 201220220123 班级: 1222201 专业:数字媒体技术
指导教师:张金
2015年08 月08日
目录
一、引言 (3)
1.1 项目背景 (3)
1.2 项目研究的目的 (4)
1.3 安卓简介 (4)
二.功能分析 (5)
2.1 功能需求分析 (5)
2.2 系统性能需求 (6)
2.3 运行环境需求 (6)
三.程序详细设计 (6)
3.1 主界面的设计 (6)
3.2 播放界面设计 (11)
3.3 其他功能 (14)
四.调试与运行 (18)
4.1 调试 (18)
4.2 运行结果 (19)
五.总结 (21)
一、引言
1.1 项目背景
当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,symbian,Windows mobile,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。

那么能否在手机上拥有自己编写的个性音乐播放器呢?答案是:肯定的,谷歌Android系统就能做到。

本文的音乐播放器就是基于谷歌Android手机平台的播放器。

随着计算机的广泛运用,手机市场的迅速发展,各种音频视频资源也在网上广为流传,这些资源看似平常,但已经渐渐成为人们生活中必不可少的一部分了。

于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。

针对以上各种弊端,选择了开发多语种的音频视频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户(如听歌,看电影)的需求,除了能播放常见格式的语音视频文件,高级功能:还能播放RMVB格式的视频文件。

此外,还能支持中文、英文等语言界面。

1.2 项目研究的目的
1.熟悉一下eclipse工具和安卓的环境配置及开发的过程;
2.熟练掌握java的组件如button,textview,listView,menu等组件的灵活应用;
3.熟练掌握安卓的一个关于数据保存的方式SQLite3;
4.锻炼一下自己遇到问题,然后解决问题的能力。

1.3 安卓简介
1.3.1 Android特征
1.提供访问硬件的API函数,简化像摄像头、GPS等硬件的访问过程具有自己的运行时和虚拟机
2.提供丰富的界面控件供使用者之间调用,加快用户界面的开发速度,保证Android平台上程序界面的一致性
3.提供轻量级的进程间通讯机制Intent,使跨进程组件通信和发送系统级广播成为可能
4.提供了Service作为无用户界面,长时间后台运行的组件
5.支持高效、快速的数据存储方式
1.3.2 Android应用程序框架
提供Android平台基本的管理功能和组件重用机制:
Activity Manager,管理应用程序的生命周期
Windows Manager,启动应用程序的窗体
Content Provider,共享私有数据,实现跨进程的数据访问
Package Manager,管理安装在Android系统内的应用程序
Teleghony Manager,管理与拨打和接听电话的相关功能
二.功能分析
2.1 功能需求分析
根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。

下面图2-1是音乐播放器的基本用例图,描述了程序的基本功能
2.2 系统性能需求
根据Android手机系统要求无响应时间为5秒,所以就有如下性能要求:
(1)当要求歌曲播放时,程序响应时间最长不能超过5秒
(2)当要求歌曲暂停时,程序响应时间最长不能超过5秒
(3)当要求歌曲停止时,程序响应时间最长不能超过5秒
(4)当要求歌曲上/下一首时,程序响应时间最长不能超过5秒(5)当要求进行清单列表时,程序响应时间最长不能超过5秒
2.3 运行环境需求
操作系统:Android手机基于Linux操作系统
支持环境:Android 1.5 - 4.2.2版本
开发环境:Eclipse 3.5 ADT 21
三.程序详细设计
3.1 主界面的设计
●主界面包含本地列表获取、我的收藏、在线音乐及正在播
放等各个功能的切换。

首先为我们出现的是音乐列表的获取。

●Android系统提供了MediaScanner,MediaProvider,
MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。

当手机开机或者有SD卡插拔等
事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文
件,如audio,video,图片等,将相应的信息放到定义好的数
据库表格中。

在这个程序中,我们不需要关心如何去扫描手机
中的文件,只要了解如何查询和使用这些信息就可以了。

MediaStore中定义了一系列的数据表格,通过
ContentResolver提供的查询接口,我们可以得到各种需要的
信息;
其主要方法如下:
●创建ArrayList<>存储音乐列表;
●用Cursor query(Uri uri, String[] projection, String
selection, String[] selectionArgs, String sortOrder);
来获取手机上的音乐;
●用MediaStore.Audio.Media.XXX(XXX可以是ALBUM,SIZE,
DURATION等信息)来获取音乐相关信息;
生成音乐列表。

关键代码:
public class MusicList {
public static ArrayList<Music> getMusicData(Context context) {
ArrayList<Music> musicList = new ArrayList<Music>();
ContentResolver cr = context.getContentResolver();
if (cr != null) {
// 获取所有歌曲
Cursor cursor = cr.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if (null == cursor) {
return null;
}
if (cursor.moveToFirst()) {
do {
Music m = new Music();
String title = cursor.getString(cursor .getColumnInd ex(MediaStore.Audio.Media.TITLE));
String singer = cursor.getString(cursor
.getColumnInd ex(MediaStore.Audio.Media.ARTIST));
if ("<unknown>".equals(singer)) {
singer = "未知艺术家";
}
String album = cursor.getString(cursor
.getColumnInd ex(MediaStore.Audio.Media.ALBUM));
long size = cursor.getLong(cursor
.getColumnInd ex(MediaStore.Audio.Media.SIZ
E));
long time = cursor.getLong(cursor
.getColumnInd ex(MediaStore.Audio.Media.DURATION));
String url = cursor.getString(cursor
.getColumnInd ex(MediaStore.Audio.Media.DAT A));
String name = cursor
.getString(cursor
.getColumnInd ex(MediaStore.Audio.Media.DISPLAY_NAME));
String sbr = name.substring(name.length() - 3, name.length());
if (sbr.equals("mp3")) {
m.setTitle(title);
m.setSinger(singer);
m.setAlbum(album);
m.setSize(size);
m.setTime(time);
m.setUrl(url);
m.setName(name);
musicList.ad d(m);
}
} while (cursor.moveToNext());
}
if (cursor != null) {
cursor.close();
}
}
return musicList;
}
}
主界面的模拟器效果图
3.2 播放界面设计
播放界面是播放器的核心所在,它需要实现播放器的其本功能(播放、暂停、上一曲、下一曲、声音控制、播放方式等)。

首先,我们需要实现其播放/暂停功能。

private void play() {
if (mp != null) {
mp.start();}
flag = 1;} //播放歌曲
private void pause() {
if (mp != null) {
mp.pause();}
flag = 1;}//暂停歌曲
上/下一曲功能的实现:
private void lastOne() {
ShowNotifcation();
if (_ids.length == 1) {
position = position;
} else if (position == 0) {
position = _ids.length - 1;
} else if (position > 0)
{position--;} //上一曲
private void nextOne() {
ShowNotifcation();
if (_ids.length == 1|| PlayMusicActivity.loop_flag == PlayMusicActivity.LOOP_ONE) {
position = position;}
else if (PlayMusicActivity.loop_flag == PlayMusicActivity.LOOP_ALL) {
if (PlayMusicActivity.random_flag == true) {// 获得随机位置
int i = getRandomPostion(true);
if (i == -1) {stop();
return;} else {
position = i;}} else {if (position == _ids.length - 1) {position = 0;
} else if (position < _ids.length - 1) {
position++;}}} else if (PlayMusicActivity.loop_flag == PlayMusicActivity.LOOP_NONE) {
if (PlayMusicActivity.random_flag == true) {//
int i = getRandomPostion(false);
if (i == -1) {stop();return;} else {
position = i;}} else {
if (position == _ids.length - 1) {stop();
return;} else if (position < _ids.length - 1) {
position++;}}} //下一首
接着就是声音的控制,声音的控制是通过一根进度条来实现,其主要代码如下:
private OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (seekBar.getId() == R.id.sb_player_voice) {// 设置音量
am.setStreamV olume(AudioManager.STREAM_MUSIC,
progress, 0);}}
@Override
public void onStartTrackingTouch(SeekBar arg0) {}
@Override
public void onStopTrackingTouch(SeekBar arg0) {}
最后,要实现播放方式,主要有两种方式,随即和顺序。

3.3 其他功能
事件监听的部分代码:
private void initComponent() {
ib_play = (ImageButton) findViewById(R.id.play);
ib_pause = (ImageButton) findViewById(R.id.pause);
ib_stop = (ImageButton) findViewById(R.id.stop);
ib_fileList = (ImageButton) findViewById(R.id.file_list);
ib_prev = (ImageButton) findViewById(R.id.prev);
ib_next = (ImageButton) findViewById(R.id.next);
ib_volumeAdd = (ImageButton) findViewById(R.id.volume_add);
ib_volumeSub = (ImageButton) findViewById(R.id.volume_sub);
onClickListener = new OnClickListener();
ib_play.setOnClickListener(onClickListener);
ib_pause.setOnClickListener(onClickListener);
ib_stop.setOnClickListener(onClickListener);
ib_fileList.setOnClickListener(onClickListener);
ib_prev.setOnClickListener(onClickListener);
ib_next.setOnClickListener(onClickListener);
ib_volumeAdd.setOnClickListener(onClickListener);
ib_volumeSub.setOnClickListener(onClickListener);
}
界面背景实现:
//调用背景图片
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="/apk/res/android"
android:src="@drawable/beijing" >
</bitmap>
//定义图片大小,位置,调用图片
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:contentDescription="@string/hello_world"
android:src="@drawable/ic_launcher1" />
获取皮肤Id
* */
public int getCurrentSkinId(){
int skinIndex =
settingPreference.getInt(KEY_SKINID, 0);
if (skinIndex >= SKIN_RESOURCES.length) { skinIndex = 0;
}
return skinIndex;
}
/**
*设置皮肤资源ID
* */
public void setCurrentSkinResId(int skinIndex) { Editor it = settingPreference.edit();
it.putInt(KEY_SKINID, skinIndex);
mit();
}
设置正常模式和夜间模式
* */
public void setBrightness(View v) {
Setting setting = new Setting(this, true);
String
brightness=setting.getValue(Setting.KEY_BRIGHTNESS);
MenuAdapter.ViewHolder
viewHolder=(MenuAdapter.ViewHolder)v.getTag();
youtParams attributes = getWindow().getAttributes();
if(brightness!=null&&brightness.equals("0")){//夜间模式
_title.setText(getResources().getStrin g(R.string.darkness_title));
viewHolder.btn_menu.setBackgroundResource(R.drawabl
e.btn_menu_darkness);
attributes.screenBrightness=brightnesslevel;
setting.setValue(Setting.KEY_BRIGHTNESS, "1");
getWindow().setAttributes(attributes);
}else{//正常模式
_title.setText(getResources().getStrin g(R.string.brightness_title));
viewHolder.btn_menu.setBackgroundResource(R.drawabl e.btn_menu_brightness);
attributes.screenBrightness=Setting.KEY_DARKNESS;
setting.setValue(Setting.KEY_BRIGHTNESS, "0");
getWindow().setAttributes(attributes);
}
}
四.调试与运行4.1 调试
下图为通过Run调试后的结果:
4.2 运行结果
1.在手机上进行app的安装及使用:,打开手机app主界面:
2.随机单击一首歌,进入播放界面(也可通过正在播放按钮进入)。

在这个界面可以进行上一曲/下一曲,暂停/播放/停止、随机播放/顺序播放及声音的控制,上图(左)为进入界面,上图(右)为声音更改界面。

3.双击目录按钮,出现工具面板,进行皮肤更改命令:
4.设置睡眠时间:
5.我的收藏及在线音乐;
z
五.总结
在这次设计开发音乐播放器过程中,我主要负责代码的编写,由于对android的接触较少,经过这一个月的学习,我学到了很多,而且在这一段时间的实际动手学习中,我对android这门课程又有了更深刻的认识,这次音乐播放器的设计主要对mp3音频格式的文件实现播放控制:播放/暂停歌曲、停止播放、上/下首歌曲切换、删除歌曲、添加背景、循环播放、快进等功能;本次设计虽能实现音乐播放器的基本功能,但仍然存在着许多不足,音量的控制始终没有做好,由于时间等原因,最终交程序的时候还是没有调试好对音量的控制。

编程虽然遇到很多问题,过程中苦恼,着急等,但是收获同样是巨大的,在设计中每解决一个问题,那种成就感是无法言语的。

编程中遇
到的诸多问题,后来经过自己思考,找同学咨询,借助参考书资料以及网络资源,找到了问题所在,进行了多次修改调试之后终于得到了运行结果,这让我感觉到了学会收集资料也是很重要的,可以在这个过程中学到不少知识。

在这过程中,老师和同学的帮助还是很大的,特别是老师的指导,能够更加了解到程序的设计等知识的重要性。

最后,通过这次设计,不但学会了如何去利用课本和参考资料,而且提高了设计和制作过程中解决实践问题的能力,把在课堂所学的知识灵活运用,理论联系实际,为以后的学习和工作打下了扎实的基础。

相关文档
最新文档