基于android的MP3音乐播放器任务书
- 格式:docx
- 大小:19.14 KB
- 文档页数:3
Android应用开发--MP3简单音乐播放器点击列表会进入播放的Activity,在这个Activity会接收到从前面的Activity传来的数据,在通过这些数据来启动服务来播放音乐,整个过程很简单,需要注意的是我们要接收的数据是哪些内容,还有我们向Service要传什么样的数据,这是根据自己的开发思路和需求来决定的,等一下你们会看到小鬼到底往Service传了些什么东西,然而这些数据到底起什么作用,需要慢慢去体会,因为这是需要一点一点去调试的。
好了,下面贴一下整个Activity的实现代码,主要是播放的各种状态的实现,因为这个音乐播放器并没有完全开发完,所以朋友们需要弄清楚这一点。
如果对代码的实现有不清楚的,可以给小鬼留言,小鬼有空一定给大家解答。
效果如下:代码如下:package com.anjovo.as.chapter10.exam01;import java.io.IOException;import android.media.AudioManager;import android.media.MediaPlayer;import .Uri;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class MusicPlayerActivity extends Activity {protected static final int REQUEST_CODE = 1;private Button btnPlay,btnPause,baStop,back;private ImageView image;private TextView text;private MediaPlayer player;int position = 0;//声明一个变量判断是否为播放,默认为falseprivate boolean isPaused = false,Media=false;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(yout.activity_music_player);btnPlay = (Button) findViewById(R.id.bt_play);btnPause = (Button) findViewById(R.id.bt_pause);baStop = (Button) findViewById(R.id.bt_stop);back = (Button) findViewById(R.id.bt_back);image = (ImageView)findViewById(R.drawable.ic_launcher);text = (TextView) findViewById(R.id.text);image = (ImageView) findViewById(R.drawable.fengcun);registerForContextMenu(baStop);//注册,让这个bastop将会启用上下文菜单text.setText("歌词下载错误!");final Intent serintent = newIntent(this,newActivity.class);btnPause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubstartActivityForResult(serintent,REQUEST_CODE);}});back.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubfinish();if(Media==true){player.stop();player.release();}}});}public void BlooeanMedia(){if(Media==true){player.release();}}public void Player(MediaPlayer player){ try {if(player!=null){player.stop();}player.prepare();player.start();isPaused = true;Media=true;Toast.makeText(this, "音乐播放中...", Toast.LENGTH_LONG).show();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stubswitch(item.getItemId()){case 1:/** 用户点击了Id为“1”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this,R.raw.wintersecret);MediaPlayer(player);Player(player);text.setText("周传雄-冬天的秘密...");break;case 2:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this, R.raw.after);MediaPlayer(player);Player(player);text.setText("庄心研-以后的以后...");break;case 3:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this, R.raw.baby);MediaPlayer(player);Player(player);text.setText("张悬-宝贝...");break;case 4:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this, R.raw.lovegirl);MediaPlayer(player);Player(player);text.setText("张赫宣-你是我心爱的姑娘...");break;case 5:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 5被选择",Toast.LENGTH_LONG).show();break;case 6:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 6被选择",Toast.LENGTH_LONG).show();break;case 7:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 7被选择",Toast.LENGTH_LONG).show();break;case 8:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 8被选择",Toast.LENGTH_LONG).show();break;case 9:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 9被选择",Toast.LENGTH_LONG).show();break;case 10:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 10被选择",Toast.LENGTH_LONG).show();break;}return super.onOptionsItemSelected(item);}private void MediaPlayer(final MediaPlayer player) { // TODO Auto-generated method stub//增加播放音乐按钮的事件btnPlay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry {if(player!=null){if(isPaused==false){player.start();isPaused=true;Toast.makeText(getApplicationContext(), "音乐播放中...", Toast.LENGTH_LONG).show();}else if(isPaused==true){player.pause();//暂停isPaused=false;Toast.makeText(getApplicationContext(), "音乐暂停中...", Toast.LENGTH_LONG).show();}}player.prepare();//同步地准备播放或回放player.start();//开始播放} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});//播放完毕player.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer arg0) {// TODO Auto-generated method stubtry{//释放dtmimi.mp3这个资源,让它可被其它播放器使用player.release();//释放MediaPlayerToast.makeText(getApplicationContext(), "音乐播放结束!", Toast.LENGTH_LONG).show();text.setText("");}catch(Exception e){Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();e.printStackTrace();}}});//播放出错的处理player.setOnErrorListener(newMediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer arg0, int arg1, int arg2) {// TODO Auto-generated method stubtry{//发生错误时也释放资源player.release();Toast.makeText(getApplicationContext(), "播放发生异常!", Toast.LENGTH_LONG).show();}catch(Exception e){Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show();e.printStackTrace();}return false;}});}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {// TODO Auto-generated method stubsuper.onCreateContextMenu(menu, v, menuInfo);menu.add(Menu.NONE, 1, Menu.NONE, "周传雄-冬天的秘密");menu.add(Menu.NONE, 2, Menu.NONE, "庄心研-以后的以后");menu.add(Menu.NONE, 3, Menu.NONE, "张悬-宝贝");menu.add(Menu.NONE, 4, Menu.NONE, "张赫宣-你是我心爱的姑娘");menu.add(Menu.NONE, 5, Menu.NONE, R.string.menu_item5);//将Item6设置为子菜单SubMenu subMenu = menu.addSubMenu(Menu.NONE, 6, Menu.NONE, R.string.menu_item6);subMenu.setHeaderIcon(R.drawable.ic_launcher);subMenu.setIcon(R.drawable.ic_launcher);subMenu.setHeaderTitle("子菜单");subMenu.add(Menu.NONE, 7, Menu.NONE,R.string.menu_item7);subMenu.add(Menu.NONE, 8, Menu.NONE,R.string.menu_item8);subMenu.add(Menu.NONE, 9, Menu.NONE,R.string.menu_item9);subMenu.add(Menu.NONE, 10, Menu.NONE,R.string.menu_item10);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if(requestCode==REQUEST_CODE&&resultCode==RESULT_OK){ if(data!=null){//通过data参数处理返回信息String info = data.getData().toString();Uri myUri = Uri.parse(info);//将传回来的路径放在myUri中BlooeanMedia();player = new MediaPlayer();MediaPlayer(player);player.setAudioStreamType(AudioManager.STREAM_MUSIC);try {player.setDataSource(getApplicationContext(),myUri);//按地址播放player.prepare();player.start();isPaused = true;Media=true;Toast.makeText(this, "音乐播放中...", Toast.LENGTH_LONG).show();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{Toast.makeText(this, "无返回信息",Toast.LENGTH_SHORT).show();}}}}package com.anjovo.as.chapter10.exam01;import java.io.File;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import .Uri;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.Toast;/*** 使用一个包含String的List作为ListView的数据源,由于要在匿名内部类的方法中* 使用它,故将其定义为类的属性*/public class newActivity extends Activity{private List<String> dataList;private List<String> datauri;private String m_path;@Overrideprotected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(yout.array_adapter_acyivity);ListView list = (ListView) findViewById(R.id.list);dataList = new ArrayList<String>();datauri = new ArrayList<String>();m_path = new String("mnt/sdcard/");search(m_path, ".mp3", dataList,datauri);//定义一个ArrayAdapter,将数据源——dataList中的内容添加到这个ArrayAdapter//中,第二个参数指每一项将使用的界面布局final ArrayAdapter<String> adapter = newArrayAdapter<String>(this, yout.array_adapter_item, dataList);list.setAdapter(adapter);//将ArrayAdapter填充到ListView//处理用户单击选择的事件list.setOnItemClickListener(newAdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// TODO Auto-generated method stubIntent intent = new Intent();String url = datauri.get(position);intent.setData(Uri.parse(url));setResult(RESULT_OK, intent);finish();}});//处理用户长按事件list.setOnItemLongClickListener(newAdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubToast.makeText(getApplicationContext(),dataList.get(posit ion)+"删除成功!", Toast.LENGTH_LONG).show();//用户长按一项时,删除这一项内容dataList.remove(position);//通知Adapter的观察者数据源改变了,界面内容也得发生改变adapter.notifyDataSetChanged();return true; //返回true表示长按}});}}布局文件如下:<RelativeLayoutxmlns:android="/apk/res/and roid"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margi n"android:paddingLeft="@dimen/activity_horizontal_margi n"android:paddingRight="@dimen/activity_horizontal_marg in"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MusicPlayerActivity"><Buttonandroid:id="@+id/bt_pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_marginBottom="14dp"android:text="列表"/><Buttonandroid:id="@+id/bt_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/bt_pause"android:layout_alignBottom="@+id/bt_pause"android:layout_centerHorizontal="true"android:text="播放"/><Buttonandroid:id="@+id/bt_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/bt_stop"android:layout_alignParentTop="true"android:text="返回"/><Buttonandroid:id="@+id/bt_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/bt_play"android:layout_alignBottom="@+id/bt_play"android:layout_toRightOf="@+id/image"android:text="选择"/><ImageViewandroid:id="@+id/image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/text"android:layout_marginBottom="16dp"android:layout_toRightOf="@+id/bt_pause"android:src="@drawable/fengcun"/><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/bt_play"android:layout_centerHorizontal="true"android:layout_marginBottom="48dp"android:text="."/> </RelativeLayout>。
基于Android平台的音乐播放器设计文档(张纪华,农学院,021*******;查李想,农学院,021*******)第一章开发目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计的实现的这主要功能是播放Mp3等多种格式的音乐文件,并且能够控制播放,暂停,停止,上一曲,下一曲,音量调节,视觉外观,播放列表和歌曲文件的管理操作等多种播放控制功能,界面简明,操作简单。
本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。
使人们的生活更加多样化。
也使设计者更加熟练Android的技术和其它在市场上的特点。
第二章系统需求分析2.1 功能需求(用例图分析)根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。
以下分别描述:2.1.1 播放器的基本控制需求图2.1 播放器基本控制图2.1.2 播放清单列表管理需求当用户选中列表中某一项歌曲,就有的需求:图2.2 播放器清单图2.3 播放器设定图2.4 文件浏览器2.1.5 功能需求(时序图)分析2.2 系统结构图和流程图(1)音乐播放器的系统流程图(图2.5.1)图2.5.1 流程图(2)系统功能表(表2.1)和系统功能结构图(图2.5.2)表2.1 功能表图2.5.2 系统功能结构图2.3 系统界面需求播放器界面要求布局合理,颜色舒适,控制按钮友好(图2.6)图2.6 播放器界面说明:左下角为清单按钮右下角为程序退出按钮蓝色条为音轨2.4 系统性能需求根据Android手机系统要求无响应时间为5秒,所以就有如下性能要求:(1)当要求歌曲播放时,程序响应时间最长不能超过5秒(2)当要求歌曲暂停时,程序响应时间最长不能超过5秒(3)当要求歌曲停止时,程序响应时间最长不能超过5秒(4)当要求歌曲上/下一首时,程序响应时间最长不能超过5秒(5)当要求进行清单列表时,程序响应时间最长不能超过5秒2.5 运行环境需求操作系统:基于Android操作系统支持环境:Android 2.3.1—Android 4.2.5版本开发环境:Eclipse 3.5 ADT 0.95第三章 Android数据库设计3.1 数据库及字段属性设计3.1.1 字段设计(表、图)file_table 主要是保存歌曲名字、类型、路径字段说明:Id 歌曲id号 fileName 歌曲名字 filePath 歌曲路径 sort 歌曲类型(表3.1、图3.1.1)Android自带一个MediaStore封闭类专门来存储媒体信息通过Uri EXTERNAL_CONTENT_URI 来访问SDcard中的歌曲详细信息。
基于Android 系统的音乐播放器设计与实现实验报告一、实验要求:本课程设计的目的是开发一个可以播放主流音乐文件格式的播放器的播放功能模块,要求音乐播放器能够播放Mp 3,Wav 多种格式的音乐文件,能够控制播放,暂停,重播,停止,要求视觉外观美观,操作简单。
二,设计思想首先查找相关书籍与文献,了解An droid 的构架并搭建An dr oid 开发平台。
查找相关资料,了解现阶段基于And roid 平台手机音乐播放器发展现状以及相关功能。
播放器基本拥有以下功能:播放本地音乐文件对播放的状态进行控制播放设置,开始暂停停止三,系统结构ﻩ四、数据结构的说明和模块的算法流程图运行 结束暂停 开始 音乐播放器主界面音乐播放器 设定 播放界面 开始 暂停停止五、使用说明书菜单有6个功能:播放,暂停,停止,重播。
播放功能:点击后事件触发,传入歌曲名字,让程序操作该名字进行播放。
暂停功能:点击后事件触发,歌曲暂停播放。
停止功能:点击后事件触发,歌曲停止播放。
重播功能;点击后事件触发,歌曲重新播放。
六、运行结果和结果分析作为Android平台上开发的应用软件,本设计具备与用户交互的界面,界面简洁美观易于操作。
作为一款在线音乐客户端,提供给用户在线选歌的方便,提供在线播放歌曲的即时信息,如歌曲名,歌手名,时长等等。
七、我评价与总结现如今社会生活节奏日益加快,人们在忙碌的生活中欣赏音乐是最好的舒缓压力的方式之一。
随着移动设备的日益完善,我们大家都已经有了在手机上听自己喜欢歌曲的习惯,以往的做法是用数据线或者蓝牙等无线设备将PC上的歌曲复制几首到手机当中,反反复复的听,等到听厌了以后,再次装一些歌曲进去,如此反复,非常的麻烦。
因此,如果在我们的手机上能实现在线听歌,这将会带来极大的方便。
本项目是一款基于Android手机平台的音乐播放器,使Android 手机拥有个性的多媒体播放器,是手机显得更生动灵活化,与人们更为方便,让手机主人随时随地处于音乐的旋律之中。
Android多媒体播放器设计任务书第一篇:Android多媒体播放器设计任务书毕业设计(论文)任务书(指导教师填写)题目:Android多媒体播放器——本地视频研究目的采用Android的开发工具与技术完成Android 多媒体播放器——本地视频模块的开发与设计,熟悉和掌握Android开发的方法与技术,撰写并按期提交毕业论文(打印)和项目设计的软件(光盘)。
研究内容1功能要求(1)从手机sdcard搜索存放的视频(2)建立SQLite数据库进行先关操作(3)对整个播放进行优化2数据管理需求:(1)全部列表:视频路径、视频名(2)最近播放列表:视频路径、视频名(3)收藏列表:视频路径、视频名(注:以上表单仅供参考,学生可以根据实际情况增删表单以及字段信息)毕业论文(正文)基本框架系统开发工具与技术系统总体规划与设计界面设计与功能模块的程序设计系统功能测试进度安排第5周:学生提交开题报告,指导教师修改并回复学生,汇总上报。
第 5周-第12周:完成项目总体设计, 译文(3000汉字以上), 软件设计.第13周-第14周:学生在校完成论文撰写,提交指导教师审稿、定稿后打印,按指定要求装订成册.刻录光盘,准备答辩。
主要参考资料[1] 何玉洁.数据库原理与应用教程[M].北京:机械工业出版社,2005[2] 孙卫琴,李洪成.T omcat与Java Web开发技术详解[M],北京:电子工业出版社,2004[3] 唐友国,JSP网站开发详解[M],北京:电子工业出版社,2008[4] 刘晓慧,江雷.基于MVC模式设计与实现重点项目管理信息系统[J].计算机工程,2010[5] Vivek Chopra Beginning Java Server Pages[M].Wrox.2006[6] Bergsten.,H.Java server Pages, Third Edition[M],O'Reilly Media,Inc,2004指导教师:李欣联系电话:***E-Mail:***********************2011年11月12日第二篇:多媒体播放器的使用方法多媒体播放器,也叫RMVB播放器,一种可以在电视上播放网络视频文件的设备。
基于Android的音乐播放器设计一、引言随着移动互联网的发展,人们用手机听音乐的需求越来越大。
因此,对于一个音乐播放器来说,良好的用户体验和用户界面设计变得尤为重要。
基于Android系统的音乐播放器,可以充分利用Android系统的优势,为用户提供优质的音乐播放服务。
二、需求分析1.用户需求(1)良好的用户体验良好的用户体验是用户使用一个音乐播放器时最为关注的。
播放器要有良好的性能、播放流畅且不卡顿,增加用户使用时的留存时间。
(2)易操作性音乐播放器的操作要简单易学,一定要避免音乐播放器的操作复杂引起使用者的困惑和不愉快。
(3)方便的使用方便的使用就是快捷的定位到自己需要的功能,千万不要像一些播放器一样难以找到自己想要的功能。
(4)多种音乐格式支持目前音乐格式众多,一个好的音乐播放器一定要支持多种音乐格式的播放。
2.功能需求(1)播放功能重要的功能之一,音乐的播放一定要流畅不卡顿。
(2)歌词功能歌曲的歌词随着音乐的播放同步展示,让用户能够更好的理解和享受音乐。
(3)在线音乐功能在线音乐功能为用户提供了更为丰富的音乐选择,也为音乐平台提供更多的商业合作机会。
(4)下载功能这个功能是当网络环境不好时提供稳定的音乐学习环境,用户可以把歌曲下载下来,随时随地可以听取。
三、系统设计Android的音乐播放器设计1.音乐的存储用户存储的音乐和内建音乐的存储架构不同,因为内建的音乐是从系统预装的资源存储到系统内部存储,并被分类为系统音乐媒体数据库。
用户存储是用户自己存储的音乐,可以自定义目录和分类,因此不能直接做到类似内建音乐的音乐媒体库分类管理。
(2)外置存储外置存储就是SD卡,手动插上才能使用。
当我们访问外置存储的音乐时,需要文件读取的权限。
用户存储的音乐和内建存储的音乐在这个方面是一样的。
2.音乐文件和格式Android音乐播放有两种方式(1)内建资源内建资源的音乐文件保存在/res/raw目录下,这个音乐数据与.apk安装包一起发布。
android-大作业-音乐播放器软件技术系列课程Android大作业(2014 / 2015 学年第一学期)题目:音乐播放器的分析与设计专业软件工程(服务外包)学生姓名单珺瑜班级学号B12041305指导教师张怡婷易磊许鹏指导单位南京邮电大学计算机学院诚迈科技日期一、课题内容和要求音乐播放器,作为移动设备基础配备软件之一,主要功能包括从SDCard中读取音乐、显示播放音乐列表、播放音乐、显示音乐歌词、实现上一首、下一首、暂停、选择播放形式等功能。
本论文的音乐播放器采用了Android开源系统技术,利用Java语言和Eclipse编辑工具对播放器进行编写。
同时给出了详细的系统设计过程、主要界面设计及主要功能运行流程图二、需求分析本课题基于Android手机平台上开发的音乐播放器主要设计了四个界面,包括:欢迎界面,主界面,播放界面和关于界面。
每个界面的主要功能为:欢迎界面为显示App的logo;主界面利用ListView显示读取SDCard后的App中的全部歌曲列表,通过滑动屏幕并选择可以实现与我的收藏界面、关于界面的切换,通过点击具体歌曲可以实现与播放界面的切换;我的收藏界面利用ListView显示用户收藏的歌曲列表,通过滑动屏幕并选择可以实现与主界面、关于界面的切换,通过点击具体歌曲可以实现与播放界面的切换。
播放界面用以显示正在播放的歌曲的歌曲名、歌手、歌词等主要信息,并设置按钮实现前一曲、后一曲、播放暂停等功能,通过播放形式按钮可以选择单曲循环、随机播放或者是顺序播放,除此之外,界面下方利用Android自带seekbar设置的进度条可以根据用户需要调节播放进度;关于界面用以显示App的主要功能等信息。
三、软件设计(一)、系统主要功能模块包括:1、欢迎界面:初始化Intent以实现欢迎界面开始1.5秒之后进入歌单列表界面。
2、歌单列表:a、歌曲:利用ListView类显示歌曲列表,点击歌曲名称即选定歌曲启动音乐播放器,播放选中的歌曲b、菜单:点击关于即可跳转至关于界面,点击我的收藏即可跳转至我的收藏界面3、我的收藏界面:a、歌曲:利用ListView类显示歌曲列表,点击歌曲名称即选定歌曲启动音乐播放器,播放选中的歌曲b、菜单:点击关于即可跳转至关于界面,点击歌曲列表即可跳转至主界面4、播放界面:a、播放:选择音乐后,点击播放按钮启动音乐播放器,即当MSG=MEDIA_PLAY时,播放所选中的歌曲,执行playMusic;b、暂停:点击暂停键,即当MSG=MEDIA_PAUSE时,停止正在播放的歌曲,执行pauseMusic;c、上一曲:点击上一曲,即当MSG=MEDIA_PREVIOUS时,停止正在播放的歌曲,播放播放列表中上一首歌曲;d、下一曲:点击下一曲,即当MSG=MEDIA_NEXT时,停止正在播放的歌曲,播放播放列表中下一首歌曲;e、播放模式:点击播放模式,利用MusicCompleteListener类可以依次改变播放模式至随机播放、列表循环或者单曲循环,进而执行randomRepeat、allRepeat或者singleRepeat;(1)随机播放:利用系统随机生成一个0—1之间的随机数乘当前position,再用int取整,即为下一首歌曲的position(2)列表循环:利用position变量,当position++!=NULL时,position自增,否则position=0(3)单曲循环:position不发生任何变化f、进度条:利用Android自带的seekbar设置进度条,用户可以根据进度条来自主控制歌曲播放进度,随意跳转;g、歌词显示:利用LyricView类完成歌词随着时间滚动显示的功能。
Android应⽤开发--MP3⾳乐播放器代码实现(⼀)需求1:将内存卡中的MP3⾳乐读取出来并显⽰到列表当中1. 从数据库中查询所有⾳乐数据,保存到List集合当中,List当中存放的是Mp3Info对象2. 迭代List集合,把每⼀个Mp3Info对象的所有属性,保存到Map对象当中3. 定义⼀个List集合,把Map对象添加到List集合当中4. 通过定义⼀个SimpleAdpter,调⽤setAdpter⽅法,将数据显⽰到列表当中[java]1. /**2. * ⽤于从数据库中查询歌曲的信息,保存在List当中3. *4. * @return5. */6. public List<Mp3Info> getMp3Infos() {7. Cursor cursor = getContentResolver().query(8. MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,9. MediaStore.Audio.Media.DEFAULT_SORT_ORDER);10. List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();11. for (int i = 0; i < cursor.getCount(); i++) {12. Mp3Info mp3Info = new Mp3Info();13. cursor.moveToNext();14. long id = cursor.getLong(cursor15. .getColumnIndex(MediaStore.Audio.Media._ID)); //⾳乐id16. String title = cursor.getString((cursor17. .getColumnIndex(MediaStore.Audio.Media.TITLE)));//⾳乐标题18. String artist = cursor.getString(cursor19. .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家20. long duration = cursor.getLong(cursor21. .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长22. long size = cursor.getLong(cursor23. .getColumnIndex(MediaStore.Audio.Media.SIZE)); //⽂件⼤⼩24. String url = cursor.getString(cursor25. .getColumnIndex(MediaStore.Audio.Media.DATA)); //⽂件路径26. int isMusic = cursor.getInt(cursor27. .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为⾳乐28. if (isMusic != 0) { //只把⾳乐添加到集合当中29. mp3Info.setId(id);30. mp3Info.setTitle(title);31. mp3Info.setArtist(artist);32. mp3Info.setDuration(duration);33. mp3Info.setSize(size);34. mp3Info.setUrl(url);35. mp3Infos.add(mp3Info);36. }37. }38. return mp3Infos;39. }[java]1. /**2. * 填充列表3. * @param mp3Infos4. */5. public void setListAdpter(List<Mp3Info> mp3Infos) {6. List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();7. for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {8. Mp3Info mp3Info = (Mp3Info) iterator.next();9. HashMap<String, String> map = new HashMap<String, String>();10. map.put("title", mp3Info.getTitle());11. map.put("Artist", mp3Info.getArtist());12. map.put("duration", String.valueOf(mp3Info.getDuration()));13. map.put("size", String.valueOf(mp3Info.getSize()));14. map.put("url", mp3Info.getUrl());15. mp3list.add(map);16. }17. mAdapter = new SimpleAdapter(this, mp3list,18. yout.music_list_item_layout, new String[] { "title", "Artist", "duration" },19. new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });20. mMusiclist.setAdapter(mAdapter);21. }实现效果如图:需求2:点击列表的每⼀项,启动⼀个服务来播放⾳乐1. 注册条⽬点击监听器OnItemClickListener2. 定义⼀个实现OnItemClickListener接⼝的内部类3. 定义⼀个继承Service的服务类PlayerServie1. 注册条⽬点击监听器OnItemClickListener[java]1. mMusiclist = (ListView) findViewById(R.id.music_list);2. mMusiclist.setOnItemClickListener(new MusicListItemClickListener());3. mp3Infos = getMp3Infos();4. setListAdpter(getMp3Infos());2. 定义⼀个实现OnItemClickListener接⼝的内部类[java]1. private class MusicListItemClickListener implements OnItemClickListener {2. @Override3. public void onItemClick(AdapterView<?> parent, View view, int position,4. long id) {5. if(mp3Infos != null) {6. Mp3Info mp3Info = mp3Infos.get(position);7. Log.d("mp3Info-->", mp3Info.toString());8. Intent intent = new Intent();9. intent.putExtra("url", mp3Info.getUrl());10. intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);11. intent.setClass(MainActivity.this, PlayerService.class);12. startService(intent); //启动服务13. }14. }15. }3. 定义⼀个继承Service的服务类PlayerServie(未完善的Service类)[java]1. package com.wwj.sb.service;2.3.4. import android.annotation.SuppressLint;5. import android.app.Service;6. import android.content.Intent;7. import android.media.MediaPlayer;8. import android.media.MediaPlayer.OnPreparedListener;9. import android.os.IBinder;10.11. import com.wwj.sb.domain.AppConstant;12.13. @SuppressLint("NewApi")14. public class PlayerService extends Service {15. private MediaPlayer mediaPlayer = new MediaPlayer(); //媒体播放器对象16. private String path; //⾳乐⽂件路径17. private boolean isPause; //暂停状态18.19. @Override20. public IBinder onBind(Intent arg0) {21. return null;22. }23.24. @Override25. public int onStartCommand(Intent intent, int flags, int startId) {26. if(mediaPlayer.isPlaying()) {27. stop();28. }29. path = intent.getStringExtra("url");30. int msg = intent.getIntExtra("MSG", 0);31. if(msg == AppConstant.PlayerMsg.PLAY_MSG) {32. play(0);33. } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {34. pause();35. } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {36. stop();37. }38. return super.onStartCommand(intent, flags, startId);39. }40.41.42. /**43. * 播放⾳乐44. * @param position45. */46. private void play(int position) {47. try {48. mediaPlayer.reset();//把各项参数恢复到初始状态49. mediaPlayer.setDataSource(path);50. mediaPlayer.prepare(); //进⾏缓冲51. mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册⼀个监听器52. }53. catch (Exception e) {54. e.printStackTrace();55. }56. }57.58. /**59. * 暂停⾳乐60. */61. private void pause() {62. if (mediaPlayer != null && mediaPlayer.isPlaying()) {63. mediaPlayer.pause();64. isPause = true;65. }66. }67.68. /**69. * 停⽌⾳乐70. */71. private void stop(){72. if(mediaPlayer != null) {73. mediaPlayer.stop();74. try {75. mediaPlayer.prepare(); // 在调⽤stop后如果需要再次通过start进⾏播放,需要之前调⽤prepare函数76. } catch (Exception e) {77. e.printStackTrace();78. }79. }80. }81.82.83. @Override84. public void onDestroy() {85. if(mediaPlayer != null){86. mediaPlayer.stop();87. mediaPlayer.release();88. }89. }90. /**91. *92. * 实现⼀个OnPrepareLister接⼝,当⾳乐准备好的时候开始播放93. *94. */95. private final class PreparedListener implements OnPreparedListener {96. private int positon;97.98. public PreparedListener(int positon) {99. this.positon = positon;100. }101.102. @Override103. public void onPrepared(MediaPlayer mp) {104. mediaPlayer.start(); //开始播放105. if(positon > 0) { //如果⾳乐不是从头播放106. mediaPlayer.seekTo(positon);107. }108. }109. }110.111. }public class MusicActivity extends Activity {private boolean isStop = false;private MediaPlayer mPlayer;public final String TITLE = Environment.getExternalStorageDirectory()+ "/iwantyourlove.mp3";private File file;private SeekBar seekBar;private ImageView play;private TextView title;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.music_main);initWidgets();}// 重新初始化播放器public void initWidgets() {play = (ImageView) findViewById(R.id.img_stop);title = (TextView) findViewById(R.id.title);seekBar = (SeekBar) findViewById(R.id.seek);seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total); //Log.i("sss", seekBar.getProgress()+"");//mPlayer.seekTo(mPlayer.getCurrentPosition());mPlayer.seekTo(seekBar.getProgress() * mPlayer.getDuration() /100 );}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// Log.i("progress", ""+progress);// Log.i("qqq", seekBar.getProgress()+"");// progress = currentPosition * 100 / duration;//progress*duration/100//mPlayer.seekTo(progress * mPlayer.getDuration() /100 );}});file = new File(TITLE);title.setText(file.getName());mPlayer = new MediaPlayer();try {mPlayer.setDataSource(TITLE);mPlayer.prepare();} catch (Exception e) {e.printStackTrace();}}public void play(View v) {if (!mPlayer.isPlaying()) {mPlayer.start();}}public void pause(View v) {if (mPlayer.isPlaying()) {mPlayer.pause();}}public void replay(View v) {mPlayer.reset();initWidgets();// 重新构建播放器// mPlayer.start();play(v);}public void stop(View v) {isStop = true;mPlayer.stop();play.setImageResource(R.drawable.player_play);}// ⽤图⽚代替按钮public void playOrPause(View v) {if (isStop) {// 停⽌后重新开始播放mPlayer.reset();initWidgets();mPlayer.start();play.setImageResource(R.drawable.player_pause);isStop = false;} else if (mPlayer.isPlaying()) {// 播放状态play.setImageResource(R.drawable.player_play);mPlayer.pause();} else {// 暂停状态play.setImageResource(R.drawable.player_pause);mPlayer.start();}// 异步任务new MusicTask().execute();}@Overrideprotected void onDestroy() {super.onDestroy();// 释放资源mPlayer.release();}// ⾳乐播放异步任务class MusicTask extends AsyncTask<Void, Void, Void> {//int current = mPlayer.getCurrentPosition();// 当前播放是什么位置,int total = mPlayer.getDuration(); // ⾳乐总共多长时间@Overrideprotected Void doInBackground(Void... params) {// 让SeekBar跟着⾳乐⼀起向右边⾛while (mPlayer.getCurrentPosition() <= total&&!isStop) { //!isPause不是停⽌状态try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}publishProgress();}return null;}@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);// Log.i("msg", ""+mPlayer.getCurrentPosition() * 100 / total);seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total); }@Overrideprotected void onPostExecute(Void result) {super.onPostExecute(result);}}}。
摘要由Google倡导发起的开放式手机联盟及其推出的Android平台一经发布便在业内引起了轩然大波。
在此背景下本人利用Eclipse和Android SDK开发工具设计出了一款基于Android的MP3播放器。
文章首先介绍了Android技术及其特点,然后介绍Android的开发环境,接着对系统进行了总体分析,在设计出了功能结构图和流程图之后,在分析需求的基础上详细阐述了MP3播放器的设计与实现过程,最后测试系统,对播放器的不足进行总结。
该播放器支持搜索本地音乐、播放音乐,集播放、暂停、停止、上一首、下一首、音量调节、歌词显示等功能于一体。
关键字:Android系统;MP3播放器AbstractBy Google advocate the release of the league and its mobile phone launched the launch of the Android platform has issued and caused a stir in the industry. I use Eclipse and Android SDK development tools design a MP3 player which based on Android. This article first introduces the Android technology and features, And then introduced the Android development environment, Then the system as a whole analysis, In a function structure chart and design flow chart after, On the basis of analysis demand expounds the MP3 player after the design and realization of the process, The last test system, To the deficiency of the players were summarized in this paper. The player supports playback of local music, search, and it has a certain practicality. The music player episode pause, stop, and a on, next, volume adjustment, lyrics display functions, such as performance is good, and it can operate independently in the Android system.Keywords:Android system; MP3 player目录1 绪论 (1)1.1 课题背景 (1)1.2 Android的介绍 (1)1.3 Android开发环境的搭建 (2)1.4 Android SDK 1.6的模拟器的介绍 (5)2 系统的总体设计概要 (6)2.1 总体功能架构 (6)2.2 功能流程图 (7)3 详细设计与实现 (8)3.1 Android程序设计的一般方法 (8)3.2 MP3播放器的模块设计 (8)3.2.1编码规范 (8)3.2.2界面的搭建 (8)3.2.3播放模块 (11)4 测试与分析 (14)4.1软件测试准备工作 (14)4.2系统测试内容概要 (14)4.2.1 列表的更新测试 (14)4.2.2各种格式的歌曲的详情查看测试 (14)4.2.3测试音乐播放器主页面的显示以及一些主要操作 (14)4.2.4 测试音乐播放器的其他一些基本操作 (15)5.结束语 (16)6.参考文献 (17)1 绪论1.1 课题背景Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源移动终端操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件。
Android应用开发--MP3简单音乐播放器点击列表会进入播放的Activity,在这个Activity会接收到从前面的Activity传来的数据,在通过这些数据来启动服务来播放音乐,整个过程很简单,需要注意的是我们要接收的数据是哪些内容,还有我们向Service要传什么样的数据,这是根据自己的开发思路和需求来决定的,等一下你们会看到小鬼到底往Service传了些什么东西,然而这些数据到底起什么作用,需要慢慢去体会,因为这是需要一点一点去调试的。
好了,下面贴一下整个Activity的实现代码,主要是播放的各种状态的实现,因为这个音乐播放器并没有完全开发完,所以朋友们需要弄清楚这一点。
如果对代码的实现有不清楚的,可以给小鬼留言,小鬼有空一定给大家解答。
效果如下:代码如下:package com.anjovo.as.chapter10.exam01。
import java.io.IOException。
import android.media.AudioManager。
import android.media.MediaPlayer。
import .Uri。
import android.os.Bundle。
import android.app.Activity。
import android.content.Intent。
import android.view.ContextMenu。
import android.view.ContextMenu.ContextMenuInfo。
import android.view.Menu。
import android.view.MenuItem。
import android.view.SubMenu。
import android.view.View。
import android.widget.Button。
import android.widget.ImageView。
毕业设计任务书
通信工程本科专业(08级)
题目:基于Android的MP3音乐播放器设计
学生姓名:武亚军班级:通信工程3班学号:08250315
指导教师:郑玉峰(校内),胡莉(校外)
一、设计目标和内容:
本文就是基于Android系统上的一款MP3音乐播放器应用程序的设计与实现。
Android是一个开源的系统,它底层是基于Linux的操作系统,本设计的MP3音乐播放器采用了Android开源系统技术,利用Java语言和Eclipse 编辑工具对播放器进行编写。
同时给出了详细的系统设计过程、部分界面图及主要功能运行流程图,该音乐播放器集播放、暂停、停止、快进、上一首、下一首、音量调节、歌词显示等功能于一体,能在Android系统中能独立运行。
二、设计基本要求:
(1)完成MP3音乐播放器软件的需求分析,系统方案设计,选择软件开发工具,进行系统实施的全过程。
(2)完成毕业设计题目“基于Android的MP3音乐播放器设计”,进行需求分析,概要设计,详细设计,独立完成所承担的设计,测试,并能运行使用。
论文符合设计要求与规范,具有科学性、逻辑性。
(3)系统完整,术语准确,语言清晰,内容充实,论述全面,有文档设计的说明等。
主要具体内容如下:
介绍本设计的开发工具、运行环境,重点介绍设计的需求分析、总体设计、详细设计及主要实现技术。
(4)论文(所需材料、上机、实验、外文翻译)要求:
对本软件设计应完成相应的文档,如:需求分析中大量的相关材料的查询,软件开发工作中大量开发工具的学习,详细设计中系统实现流程等。
三、设计进度安排:
1)2012.3.1-2012.3.9:阅读查找相关设计文献资料,完成英文翻译和文献
综述;
2)2012.3.10-2012.3.16:根据资料和以往的开发、研究经验进行实验步骤
的概括和整个工程进程的描述;
3)2012.3.17-2012.4.24:完成系统分析的相关工作,基本完成有关书籍和
资料的学习和研究。
完成系统分析文档和系统设计文档;
4)2012.4.25-2012.5.1:中期检查(毕业设计的进度与质量、设计状况等)
5)2012.5.2-2012.5.24:完成设计、开发、调试和技术文档,完成毕业论
文初稿;
6)2012.5.25-2012.6.10:修改毕业论文,完善毕业设计工作,准备答辩。
四、主要参考文献(指导教师选定部分):
[1]陈昱,江兰帆.基于GoogleAndroid平台的应用程序开发和研究[J].福建电
脑,2008(11)
[2]杨丰盛.Android应用开发揭秘[M]第一版.北京:机械工业出版社,2010年
[3]姚昱旻,刘卫国.Android的架构与应用开发研究[J].计算机系统,2008(11)
[4]姚昱旻,刘卫国.Android与J2ME平台间即时通信的研究与实现[J].计算机
系统应用,2008(12)
[5]公磊,周聪.基于Android的移动终端应用程序开发与研究[J].计算机与现代
化,2008(8).
[6]差沙,地狱男爵.用Android开发手机应用[J].程序员,2008(1)
[7]叶达峰.Eclipse编程技术与实例[M].北京:人民邮电出版社,2006.
[8]张超,王阿川,王智.基于J2ME和J2EE的手机软件的研究[J].黑龙江科技信
息,2007(3)
[9]刘向辉.基于Java的移动终端中间件的研究与设计[D].华东师范大学硕士
学位论文,2005.
[10]刁扣锁.短信息在嵌入式Linux系统中的设计与实现[D].东南大学硕士学
位论文,2005.
[11]张孝祥著.java就业培训教程[M].北京:清华大学出版社,2007.
[12]余志龙编著.GoogleAndroidSDK开发范例大全[M].北京:人民邮电出版
社,2009-7-1.
[13]E2ECloud工作室著.深入浅出GoogleAndroid[M].北京:人民邮电出版
社,2009-08-1.
[14]靳岩姚尚朗著.GoogleAndroid开发入门与实战[M].北京:清华大学出版社,2009-07-01.
[15]高昂著.支持动态语言的Android平台[M].北京:人民邮电出版社,2009-05-07.
[16]Foley van Dam,feiner,Hughes.Introduction to computer graphics
[M].[s.1.]:Addison-Wesley Publishing
[17]AndroidArchitecture:URL:/site/io/anatomy-physiolog y-of-an-android
[18] Google Android,
[19] Lalit Kumar, Rajesh Kushwaha, Rishi Prakash: "Design & Development of Small Linux Operating Systems for Browser Based Digital Set Top Box", 2009 First International Conference on Computational Intelligence, Communication Systems and Networks
[20] Qiong Li, Minqiang Guo: "Digital Recordable Integrated Television Based on Embedded Linux Operating System", 2009 World Congress on Computer Science and Information Engineering。