安卓音乐播放器开发,含源代码.doc_第1页
安卓音乐播放器开发,含源代码.doc_第2页
安卓音乐播放器开发,含源代码.doc_第3页
安卓音乐播放器开发,含源代码.doc_第4页
安卓音乐播放器开发,含源代码.doc_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于android平台的音乐播放器开发实验报告学生姓名: 温从林 学 号: 201226630215 班 级: 计自1201 第一章 引 言1.1 项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Windows mobile,symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。那么能否在手机上拥有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的播放器。Android:是谷歌于2007年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。这使得越来越多的人关注这个操作系统。本次作品音乐播放器就是基于Android平台的。1.2 编写目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计实现的主要功能是播放Mp3,Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,播放列等基本播放控制功能,界面简明,操作简单。 本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使设计者更加熟练Android的技术和其它在市场上的特点。1.3 开发环境Eclipse、Android SDK 3.2.0第二章 系统需求分析2.1 功能需求(用例图分析)根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。以下分别描述:2.1.1 播放器的用例图假设安装了音乐播放器的用户是系统的主要设计对象,其拥有以下操作,启动软件、播放音乐、暂停播放、停止播放、退出软件,其用例图如下图2.1 播放器基本用例图2.1.2用例分析用例名称:启动软件参与者:用户目标:使得用户启动软件并加载手机和sd卡上的音频文件到播放列表前置条件:无基本事件流:1.用户启动软件 2.播放器将播放列表中的当前的歌曲用例名称:播放参与者:用户目标:使得用户可以播放在播放列表中选中的歌曲前置条件:播放器正在运行基本事件流:1.用户单击“播放”按钮 2.播放器将播放列表中的当前的歌曲用例名称:暂停参与者:用户目标:使得用户可以暂停正在播放的歌曲前置条件:歌曲正在播放且未停止和暂停基本事件流:1.用户单击“暂停”按钮 2.播放器将暂停当前的歌曲用例名称:停止参与者:用户目标:使得用户可以停止正在播放的歌曲前置条件:歌曲正在播放或暂停基本事件流:1.用户单击“停止”按钮 2.播放器将停止当前播放的歌曲用例名称:退出参与者:用户目标:使得用户退出或者后台播放音乐前置条件:程序在运行基本事件流:1.用户按返回键 2.播放器退出或者进入后台播放第三章 概要设计3.1软件播放流程图Step1.启动软件后,软件自动检索手机和sd卡的音频文件,并组织显示成列表.Step2.点击列表的歌曲名字。Step3.播放音乐。Step4.点击暂停,音乐暂停Step5.点击播放 转到step3Step6.点击停止 停止播放音乐Step7.点击退出。 启动软件自动检索手机中的音乐文件,并显示 选择歌曲,点击播放暂停/退出软件图3.1音乐播放器流程图第四章 界面展示4.1软件部署系统编译生成apk文件,将apk文件拷到手机或者sd卡中,直接打开即可安装。4.2启动软件打开软件后的界面4.3 歌曲列表界面歌曲列表界面4.4 播放界面4.5 收藏界面4.6 在线搜索音乐界面第5章 结 论 (1)通过本次开发解决了诸如SD卡音乐文件搜索并显示、联网搜索歌曲等难题,对安卓的开发有了更深入的认识。(2) 通过对Android手机平台的音乐播放器软件的开发,使我对Android音乐播放器系统的整体设计有一个深入的了解,对整个流程也会有一个清晰的认识。开发Android音乐播放器,要抓住开发的核心部分,音乐播放器大体由播放主界面、播放列表、菜单、播放设置、文件浏览、歌曲搜索六大核心组成。(3) 本次程序设计,对播放器的系统结构框架做了精心的构思与设计,采用主要开发工具是Eclips4.0+Java语言的支持,Android Development Tool的插件,和Android SDK2.1版本的全面结合,才使整个音乐播放器系统得以实现。 第五章 部分源代码以下给出功能实现代码,布局,风格等代码量过大,放在压缩文件中MainActivity.java:package com.example.xindong;import android.support.v7.app.ActionBarActivity;import android.support.v4.app.Fragment;import android.content.Intent;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.view.Window;public class MainActivity extends ActionBarActivity Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.fragment_main);Thread thread = new Thread() public void run() try sleep(2500); catch (InterruptedException e) e.printStackTrace();finish();Intent intent = new Intent(MainActivity.this, MusicActivity.class);startActivity(intent);thread.start();Overridepublic boolean onCreateOptionsMenu(Menu menu) / Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;Overridepublic boolean onOptionsItemSelected(MenuItem item) / Handle action bar item clicks here. The action bar will/ automatically handle clicks on the Home/Up button, so long/ as you specify a parent activity in AndroidM id = item.getItemId();if (id = R.id.action_settings) return true;return super.onOptionsItemSelected(item);/* * A placeholder fragment containing a simple view. */public static class PlaceholderFragment extends Fragment public PlaceholderFragment() Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) View rootView = inflater.inflate(R.layout.fragment_main, container,false);return rootView;BandanActivity.javapackage com.example.xindong;import com.example.Adapter.MusicListAdapter;import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.media.MediaPlayer;import android.os.Bundle;import vider.MediaStore;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class BangdanActivity extends Activity 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;/存放名称的标题数组Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.bangdanmusic_list);listview = (ListView) findViewById(R.id.bangdan_music_list);listview.setOnItemClickListener(new MusicListOnClickListener();ShowMp3List();/* * 显示MP3信息,其中_ids保存了所有音乐文件的_ID,用来确定到底要播放哪一首歌曲,_titles存放音乐名,用来显示在播放界面, * 而_path存放音乐文件的路径(删除文件时会用到)*/ private void ShowMp3List() / 用游标查找媒体详细信息Cursor cursor = this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String MediaStore.Audio.Media.TITLE, / 标题,游标从0读取MediaStore.Audio.Media.DURATION, / 持续时间,1MediaStore.Audio.Media.ARTIST, / 艺术家,2MediaStore.Audio.Media._ID, / id,3MediaStore.Audio.Media.DISPLAY_NAME,/ 显示名称,4MediaStore.Audio.Media.DATA, / 数据,5MediaStore.Audio.Media.ALBUM_ID, / 专辑名称ID,6MediaStore.Audio.Media.ALBUM, / 专辑,7MediaStore.Audio.Media.SIZE , null, null, MediaStore.Audio.Media.ARTIST);/ 大小,8/* 将游标移到第一位 */cursor.moveToFirst();/* 分别将各个标题数组实例化 */_ids = new int cursor.getCount();_titles = new Stringcursor.getCount();_artists = new Stringcursor.getCount();_path = new Stringcursor.getCount();_album = new Stringcursor.getCount();_times = new Stringcursor.getCount();_displayname = new Stringcursor.getCount();_sizes = new intcursor.getCount();/*这里获取路径的格式是_pathi=c.geString,为什么这么写?是因为MediaStore.Audio.Media.DATA的关系 到的内容格式为/mnt/sdcard/子文件夹名/音乐文件名,而我们想要得到的是/sdcard/子文件夹名音乐文件名 */for (int i = 0; i cursor.getCount(); i+) _idsi = cursor.getInt(3);_titlesi = cursor.getString(0);_artistsi = cursor.getString(2);_pathi = cursor.getString(5).substring(4);/*以下是为提供音乐详细信息而生成的 */_albumi = cursor.getString(7);_timesi = toTime(cursor.getInt(1);_sizesi = cursor.getInt(8);_displaynamei = cursor.getString(4); cursor.moveToNext(); listview.setAdapter(new MusicListAdapter(this, cursor);/*时间的转换*/public String toTime(int time) time /= 1000;int minute = time / 60;int second = time % 60;minute %= 60;/*返回结果用string的format方法把时间转换成字符类型 */return String.format(%02d:%02d, minute, second);/*音乐列表添加监听器,点击之后播放音乐 */public class MusicListOnClickListener implements OnItemClickListener Overridepublic void onItemClick(AdapterViewarg0, View view, int position,long id) musicpath=/mnt+_pathposition;playMusic(musicpath) ;/*putExtraMusic(position);*/Intent intent = new Intent(BangdanActivity.this, PlayMusicActivity.class);startActivity(intent);finish(); public void playMusic(String musicpath) tryMediaPlayer mp = new MediaPlayer();mp.reset();mp.setDataSource(musicpath);mp.prepare();mp.start();catch(Exception e)Toast.makeText(getApplicationContext(),无法播放此文件, Toast.LENGTH_SHORT).show();public void putExtraMusic(int position) Intent intent = new 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 = new Intent(); Bundle bundle = new Bundle(); bundle.putInt(position, 25); intent.putExtras(bundle); intent.setClass(BangdanActivity.this, PlayMusicActivity.class); startActivity(intent); finish();Overrideprotected void onStop() super.onStop();private long exitTime = 0; public boolean onKeyDown(int keyCode, KeyEvent event) 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(0); return true; return super.onKeyDown(keyCode, event); CollectionActivity.javapackage com.example.xindong;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ExpandableListActivity;import android.os.Bundle;import android.view.KeyEvent;import android.widget.SimpleExpandableListAdapter;import android.widget.Toast;public class CollectionActivity extends ExpandableListActivity Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.fragment_collection); /一级条目 ListMapgroups=new ArrayListMap(); Map group1=new HashMap(); group1.put(group,【歌手】); Map group2=new HashMap(); group2.put(group,【专辑】); groups.add(group1); groups.add(group2); /二组条目 ListListMap childs=new ArrayListListMap(); /第一组二级科目数据 ListMap child1=new ArrayListMap(); Map item1=new HashMap(); item1.put(child,林俊杰); Map item2=new HashMap(); item2.put(child,周杰伦); child1.add(item1); child1.add(item2); /第二组二级科目数据 ListMap child2=new ArrayListMap(); Map item3=new HashMap(); item3.put(child,); Map item4=new HashMap(); item4.put(child,); Map item5=new HashMap(); item5.put(child,); child2.add(item3); child2.add(item4); child2.add(item5); childs.add(child1); childs.add(child2); /SimpleExpandableListAdapter构造函数参数 /1.content /2.一级条目数据 /3.一级条目布局文件 /.一级条目Key /5.一级条目显示信息控件id /6.二级条目数据 /7.二级条目布局文件 /8.二级条目Key /9.二级条目显示信息控件id SimpleExpandableListAdapter adapter=new SimpleExpandableListAdapter(this,groups,R.layout.group, new Stringgroup,new intR.id.groupTo, childs, R.layout.child, new Stringchild, new intR.id.childTo); setListAdapter(adapter); private long exitTime = 0; public boolean onKeyDown(int keyCode, KeyEvent event) 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(0); return true; return super.onKeyDown(keyCode, event); /* * 初始化菜单 */ public boolean onMenuKeyDown(int keyCode, KeyEvent event) if(keyCode=KeyEvent.KEYCODE_MENU& event.getAction() = KeyEvent.ACTION_DOWN) Toast.makeText(getApplicationContext(), 未定义菜单, Toast.LENGTH_SHORT).show(); return true; Contsant.javapackage com.example.xindong;import android.content.Context;import android.util.DisplayMetrics;import android.view.Display;import android.view.WindowManager;public class Contsant /* * 获取屏幕的大小0:宽度 1:高度 */public static int getScreen(Context context) WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = windowManager.getDefaultDisplay();DisplayMetrics outMetrics = new DisplayMetrics();display.getMetrics(outMetrics);return new int (int) (outMetrics.density * outMetrics.widthPixels),(int) (outMetrics.density * outMetrics.heightPixels) ;/* * 获取文件的后缀名,返回大写 */public static String getSuffix(String str) int i = str.lastIndexOf(.);if (i != -1) return str.substring(i + 1).toUpperCase();return str;/* * 格式化文件大小 Byte-MB */public static String formatByteToMB(int size)float mb=size/1024f/1024f;return String.format(%.2f,mb);LRCbean.javapackage com.example.xindong;/* 歌词实体*/public class LRCbean private int beginTime = 0;/开始时间public int getBeginTime() return beginTime;public void setBeginTime(int beginTime) this.beginTime = beginTime;public int getLineTime() return lineTime;public void setLineTime(int lineTime) this.lineTime = lineTime;public String getLrcBody() return lrcBody;public void setLrcBody(String lrcBody) this.lrcBody = lrcBody;private int lineTime = 0;private String lrcBody = null;/歌词实体MDialog.javapackage com.example.xindong;import android.app.Activity;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.text.TextUtils;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;/* * 自定义的对话框 */public class MDialog extends Dialog public MDialog(Context context) super(context);public MDialog(Context context, int theme) super(context, theme);public static class Builder private Context context;private int mIcon = -1; / 提示图标private CharSequence mTitle; / 提示标题private CharSequence mMessage;/ 提示内容private CharSequence mPositiveButtonText;/ 确定按钮文本private CharSequence mNegativeButtonText;/ 拒绝按钮文本private CharSequence mNeutralButtonText; / 中间按钮文本private boolean mCancelable = true;/ 是否启用取消键private int mViewSpacingLeft;private int mViewSpacingTop;private int mViewSpacingRight;private int mViewSpacingBottom;private boolean mViewSpacingSpecified = false;/ 提示内容Viewprivate View mView;private OnClickListener mPositiveButtonClickListener,mNegativeButtonClickListener, mNeutralButtonClickListener;private OnCancelListener mCancelListener;/ 取消键事件private OnKeyListener mKeyListener; / 按键处理public Builder(Context context) this.context = context;public Builder setMessage(CharSequence message) this.mMessage = message;return this;public Builder setMessage(int message) this.mMessage = context.getText(message);return this;public Builder setTitle(int title) this.mTitle = context.getText(title);return this;public Builder setTitle(CharSequence title) this.mTitle = title;return this;public Builder setIcon(int icon) this.mIcon = icon;return this;public Builder setView(View view) this.mView = view;mViewSpacingSpecified = false;return this;public Builder setView(View view, int left, int top, int right,int bottom) this.mView = view;this.mViewSpacingLeft = left;this.mViewSpacingTop = top;this.mViewSpacingRight = right;this.mViewSpacingBottom = bottom;mViewSpacingSpecified = true;return this;public Builder setPositiveButton(int textId,final OnClickListener listener) this.mPositiveButtonText = context.getText(textId);this.mPositiveButtonClickListener = listener;return this;public Builder setPositiveButton(String text,final OnClickListener listener) this.mPositiveButtonText = text;this.mPositiveButtonClickListener = listener;return this;public Builder setNeutralButton(int textId,final OnClickListener listener) this.mNeutralButtonText = context.getText(textId);this.mNeutralButtonClickListener

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论