基于android的MP3音乐播放器任务书
Android应用开发--MP3简单音乐播放器

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平台的音乐播放器设计文档

基于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系统的音乐播放器设计与实现

01 一、需求分析
目录
02 二、设计思路
03 三、实现步骤
04 四、注意事项
05 参考内容
内容摘要
随着移动设备的普及和Android操作系统的不断发展,基于Android系统的应 用程序开发也越来越受到。其中,音乐播放器作为手机用户的常用应用之一,其 设计和实现具有重要意义。本次演示将介绍一种基于Android系统的音乐播放器 设计和实现的方法。
三、具体实现
三、具体实现
1、登录功能:用户可以通过或第三方社交账号登录,并设置密码。登录后, 用户可以浏览自己的音乐库,以及搜索歌曲、歌手、专辑等;
三、具体实现
2、搜索功能:用户可以通过关键字搜索歌曲、歌手、专辑等,也可以通过分 类筛选;
3、播放功能:用户可以播放、暂停、调节音量、添加歌曲到播放列表、从播 放列表中删除歌曲等操作;
4、其他功能实现
4、其他功能实现
除了音乐播放和音频处理,音乐播放器还需要实现其他功能,如歌词显示、 播放控制、定时关机等。这些功能可以通过Android SDK提供的API和Java编程 语言来实现。例如,可以使用Java的线程和定时器技术来实现定时关机功能。
四、总结
四、总结
本次演示介绍了基于Android的音乐播放器设计与实现的基本内容和实现方法。 主要包括了音乐播放器的功能概述、设计思路和实现方法等方面的内容。通过这 些内容的介绍,希望能对大家有所帮助,让我们一起努力,为美好的音乐事业贡 献自己的力量!
三、实现步骤
2、界面设计:使用XML布局文件设计界面,包括主界面、播放列表界面、歌 曲详情界面等。
三、实现步骤
3、数据库设计:创建SQLite数据库,定义表结构并实现增删改查操作。 4、音频解码和播放:使用MediaPlayer类进行音频解码和播放,实现播放、 暂停、停止等功能。
基于Android-系统的音乐播放器设计与实现

基于Android 系统的音乐播放器设计与实现实验报告一、实验要求:本课程设计的目的是开发一个可以播放主流音乐文件格式的播放器的播放功能模块,要求音乐播放器能够播放Mp 3,Wav 多种格式的音乐文件,能够控制播放,暂停,重播,停止,要求视觉外观美观,操作简单。
二,设计思想首先查找相关书籍与文献,了解An droid 的构架并搭建An dr oid 开发平台。
查找相关资料,了解现阶段基于And roid 平台手机音乐播放器发展现状以及相关功能。
播放器基本拥有以下功能:播放本地音乐文件对播放的状态进行控制播放设置,开始暂停停止三,系统结构ﻩ四、数据结构的说明和模块的算法流程图运行 结束暂停 开始 音乐播放器主界面音乐播放器 设定 播放界面 开始 暂停停止五、使用说明书菜单有6个功能:播放,暂停,停止,重播。
播放功能:点击后事件触发,传入歌曲名字,让程序操作该名字进行播放。
暂停功能:点击后事件触发,歌曲暂停播放。
停止功能:点击后事件触发,歌曲停止播放。
重播功能;点击后事件触发,歌曲重新播放。
六、运行结果和结果分析作为Android平台上开发的应用软件,本设计具备与用户交互的界面,界面简洁美观易于操作。
作为一款在线音乐客户端,提供给用户在线选歌的方便,提供在线播放歌曲的即时信息,如歌曲名,歌手名,时长等等。
七、我评价与总结现如今社会生活节奏日益加快,人们在忙碌的生活中欣赏音乐是最好的舒缓压力的方式之一。
随着移动设备的日益完善,我们大家都已经有了在手机上听自己喜欢歌曲的习惯,以往的做法是用数据线或者蓝牙等无线设备将PC上的歌曲复制几首到手机当中,反反复复的听,等到听厌了以后,再次装一些歌曲进去,如此反复,非常的麻烦。
因此,如果在我们的手机上能实现在线听歌,这将会带来极大的方便。
本项目是一款基于Android手机平台的音乐播放器,使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系统的音乐播放器,可以充分利用Android系统的优势,为用户提供优质的音乐播放服务。
二、需求分析1.用户需求(1)良好的用户体验良好的用户体验是用户使用一个音乐播放器时最为关注的。
播放器要有良好的性能、播放流畅且不卡顿,增加用户使用时的留存时间。
(2)易操作性音乐播放器的操作要简单易学,一定要避免音乐播放器的操作复杂引起使用者的困惑和不愉快。
(3)方便的使用方便的使用就是快捷的定位到自己需要的功能,千万不要像一些播放器一样难以找到自己想要的功能。
(4)多种音乐格式支持目前音乐格式众多,一个好的音乐播放器一定要支持多种音乐格式的播放。
2.功能需求(1)播放功能重要的功能之一,音乐的播放一定要流畅不卡顿。
(2)歌词功能歌曲的歌词随着音乐的播放同步展示,让用户能够更好的理解和享受音乐。
(3)在线音乐功能在线音乐功能为用户提供了更为丰富的音乐选择,也为音乐平台提供更多的商业合作机会。
(4)下载功能这个功能是当网络环境不好时提供稳定的音乐学习环境,用户可以把歌曲下载下来,随时随地可以听取。
三、系统设计Android的音乐播放器设计1.音乐的存储用户存储的音乐和内建音乐的存储架构不同,因为内建的音乐是从系统预装的资源存储到系统内部存储,并被分类为系统音乐媒体数据库。
用户存储是用户自己存储的音乐,可以自定义目录和分类,因此不能直接做到类似内建音乐的音乐媒体库分类管理。
(2)外置存储外置存储就是SD卡,手动插上才能使用。
当我们访问外置存储的音乐时,需要文件读取的权限。
用户存储的音乐和内建存储的音乐在这个方面是一样的。
2.音乐文件和格式Android音乐播放有两种方式(1)内建资源内建资源的音乐文件保存在/res/raw目录下,这个音乐数据与.apk安装包一起发布。
android大作业音乐播放器

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音乐播放器代码实现(一)

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);}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
毕业设计任务书
通信工程本科专业(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。