软件技术专业毕业论文36785.doc

上传人:文库蛋蛋多 文档编号:4069141 上传时间:2023-04-03 格式:DOC 页数:18 大小:500KB
返回 下载 相关 举报
软件技术专业毕业论文36785.doc_第1页
第1页 / 共18页
软件技术专业毕业论文36785.doc_第2页
第2页 / 共18页
软件技术专业毕业论文36785.doc_第3页
第3页 / 共18页
软件技术专业毕业论文36785.doc_第4页
第4页 / 共18页
软件技术专业毕业论文36785.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《软件技术专业毕业论文36785.doc》由会员分享,可在线阅读,更多相关《软件技术专业毕业论文36785.doc(18页珍藏版)》请在三一办公上搜索。

1、毕业设计论文 课程名称:面向对象课程设计 题 目:Android手机音乐播放器 程序设计任务书设计题目: 手机音乐播放器设计目的本课程的设计的目的是通过实践使同学们经历android开发全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的知识。结合具体的开发案例,理解并初步掌握系统分析、系统设计、系统实施的主要环节和步骤以及软件文档的制作能力。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)主要任务:1 完成主界面设计2 选择要播放的文件,构成播放列表3 实现播放、暂停、结束功能4 实现音量调节和循环播放选择功能5 实现后台运行设计报告撰写格式要求

2、:大标题:黑体 三号字 加粗小标题:宋体 四号字 加粗正文: 宋体 五号字时间安排:16周-19周消化资料、系统调查 1天 系统分析 1天总体设计 2天 实施计划(编写代码) 3天撰写报告 1天 演示、验收 1天具体要求1、明确课程设计的目的和重要性,认真领会课程设计的题目,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课程设计任务。2、设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完全相同者一律以抄袭论处。设计报告正文字数不少于0.2万字(不包括附录)指 导 教 师 签 字: 年 月 日系 主

3、任 签 字: 年 月 日一、 播放器的主要功能 1、自动查找sd卡中的音乐播放文件,生成播放列表。 2、具有播放,暂停,下一曲,上一曲,循环播放的功能。 3、打接电话时音乐停止,挂掉电话后重新回到播放界面继续播放音乐。 4、可以进行后台播放功能。 5、若新增MP3格式的音乐文件可以自动将该音乐文件添加到播放列表。二、 使用到的相关知识 Android各种页面布局,Android中的MediaPlayer媒体创建,Android中service后台控制播放方法,Intent意图进行Activity之间进行多页面跳转,Button按钮事件监听控制,三、 实现该音乐播放器的整体思路要实现这个音乐播放

4、器。首先应该考虑到的就是他的功能,要有后台播放功能以及显示正在播放的文件和把手机中的音乐文件以列表的形式显示在手机上,这就要使用到listview类。另外在本地歌曲列表和正在播放的歌曲之间要进行动态菜单的跳转故而想到用tabhost这个容器进行布局。后台播放创建一个类继承service方法,在该类中使其具有播放暂停下一首上一首的功能的方法,从而是它在各个Activity之间进行跳转的时候为其他的类提供相应的方法。创建一个新建文件类和过滤文件信息的类,用以存贮特定的文件信息和当用户改变文件夹终不改的内容的时候同步更新播放列表。于接打电话这个问题,创建一个类进行监听,当电话进来或出去的时候调用se

5、rvice方法停止音乐播放并记下播放点。四、 在实现过程遇到的相关问题以及解决的办法 对于刚接触Android开发的我们,在很多的知识点上还是不是很理解,鉴于此在制作的过程难免会遇到各种问题,解决的办法就是通过百度,goolge各种搜索引擎。1、 首先在开始动手构思音乐播放器界面的时候就遇到了难题,要实现动态菜单(本地音乐、正在播放的歌曲);2、 如何实现后台播放;3、 如何进行多页面之间的跳转;4、 如何进行电话监听;5、 如何将sd卡中的MP3音乐文件过滤读取到播放列表中;6、 如何自动添加更新播放列表;7、 对于listview中点击Item时触发相应的播放事件;五、 得到MP3界面图展

6、示 本地歌曲列表正在播放时候的界面 : 六、具体实现步骤1、创建main.xml布局文件。通过tabhost进行布局显示本地播放和正在播放。实现的主要代码及步骤效果图: (1)main.xml (2) 创建TabViewActivity类继承TabActivity类向tabhost容器中加入动态menu以及创建一个music类进行sd卡的音乐文件的存取和读取,创建utilFile进行文件的创建和判断。 在SD卡创建存放MP3的目录代码片段:public void createDirInSDCard() throws IOException if(new File(FileUtils.MUSIC

7、).exists() = false)File file = new File(MUSIC);file.mkdir();在SD卡上创建文件代码片段:public File creatFile(String fileName) throws IOException File file = new File(MUSIC+fileName);file.createNewFile();return file;/* * 判断文件是否存在 */public boolean isFileExist(String fileName) File file = new File(MUSIC + fileName)

8、;return file.exists();向tabhost容器中加入动态菜单项的代码片段:public void initializePlayer() / 因为继承了TabActivity,所以可以用getTabHost()获取TabHost,tabHost = this.getTabHost();/ 设置Intent指向的类intent = new Intent(this, LocalListActivity.class);/ 创建一个tabSpec,并设置它的标签和要跳转到的IntenttabSpec = tabHost.newTabSpec(local).setIndicator(本地

9、歌曲).setContent(intent);/ 将tabSpec添加到tabHost(这样就把一个分页的标签添加进去了)tabHost.addTab(tabSpec);/添加第二个标签intent = new Intent(this, PlayingMusicActivity.class);tabSpec = tabHost.newTabSpec(playingMusic).setIndicator(歌曲播放).setContent(intent);tabHost.addTab(tabSpec);(3)创建Mp3Info类,定义初始话音乐信息private static final long

10、 serialVersionUID = 1L;private String id ;private String mp3Name;private String author;private String lrcName ;private String lrcSize ;public Mp3Info()public Mp3Info(String id, String mp3Name, String author, String lrcName,String lrcSize) super();this.id = id;this.mp3Name = mp3Name;this.author = aut

11、hor;this.lrcName = lrcName;this.lrcSize = lrcSize;public String toString() return Mp3Info author= + author + , id= + id + , lrcName=+ lrcName + , lrcSize= + lrcSize + , mp3Name= + mp3Name+ ;public String getId() return id;public void setId(String id) this.id = id;public String getMp3Name() return mp

12、3Name;public void setMp3Name(String mp3Name) this.mp3Name = mp3Name;public String getAuthor() return author;public void setAuthor(String author) this.author = author;public String getLrcName() return lrcName;public void setLrcName(String lrcName) this.lrcName = lrcName;public String getLrcSize() ret

13、urn lrcSize;public void setLrcSize(String lrcSize) this.lrcSize = lrcSize;2、创建playmusic.xml布局文件用以显示播放下一首上一首控制按钮和显示正在播放的音乐文件的名字 具体代码片段: 3、创建一个playmusicService类行进后台控制音乐播放功能为Playmusic类用以控制音乐播放功能的方法。Service代码片段:public class PlayMusicService extends Service private static MediaPlayer mediaPlayer;private

14、static final String MUSIC_PATH = /sdcard/Music/;/ 歌曲是否正在播放public static boolean isPlaying = false;/ 当前播放的歌曲public static int CURRENT_SONG = 0;/ 声明一个Bundle对象,用来放置接收到的Bundle对象Bundle bundle = null;Overridepublic IBinder onBind(Intent arg0) / TODO Auto-generated method stubreturn null;Overridepublic voi

15、d onCreate() / TODO Auto-generated method stubsuper.onCreate();/ 生成MediaPlayer对象mediaPlayer = new MediaPlayer();Overridepublic void onStart(Intent intent, int startId) / TODO Auto-generated method stubsuper.onStart(intent, startId);/ 从接收到的Bundle对象中获取当前播放歌曲的位置bundle = intent.getExtras();CURRENT_SONG

16、= bundle.getInt(position);/ 条用playMusic()方法播放歌曲playMusic(CURRENT_SONG);/ 播放歌曲方法public void playMusic(int position) try / 标志为正在播放isPlaying = true;/ 获取将要播放的歌曲的位置CURRENT_SONG = position;System.out.println(当前正在播放的歌曲:+ LocalListActivity.list.get(CURRENT_SONG).get(mp3Name);mediaPlayer.reset();mediaPlayer.

17、setDataSource(MUSIC_PATH+ LocalListActivity.list.get(CURRENT_SONG).get(mp3Name);mediaPlayer.prepare();mediaPlayer.start();mediaPlayer.setOnCompletionListener(new OnCompletionListener() public void onCompletion(MediaPlayer mp) / TODO Auto-generated method stub/* * 播放当前歌曲的下一首 判断播放的是否最后一首歌,如果是,播放完返回播放第

18、一首 */if (+CURRENT_SONG = LocalListActivity.list.size() CURRENT_SONG = 0;playMusic(CURRENT_SONG);/ 动态更新正在播放歌曲的名字new PlayingMusicActivity().updatePlaySongName(CURRENT_SONG);); catch (Exception e) e.printStackTrace();/ 播放上一首歌曲public void lastMusic(int position) / 先把MediaPlayer对象切换到stoped状态if (mediaPlay

19、er != null)if(isPlaying)mediaPlayer.stop();CURRENT_SONG = position;if (CURRENT_SONG 0) / 如果当前播放的是第一首歌,则切换到最后一首CURRENT_SONG = LocalListActivity.list.size() - 1;playMusic(CURRENT_SONG);/ 播放下一首歌曲public void nextMusic(int position) / 先把MediaPlayer对象切换到stoped状态if (mediaPlayer != null)if(isPlaying)mediaPl

20、ayer.stop();CURRENT_SONG = position;/ 如果播放的是最后一首歌曲,则切换到第一首if (CURRENT_SONG = (LocalListActivity.list.size() CURRENT_SONG = 0;playMusic(CURRENT_SONG);/ 暂停/恢复播放public void pauseMusic() if (mediaPlayer != null) if (isPlaying = true) mediaPlayer.pause();isPlaying = false; /* * 恢复播放歌曲 */public void start

21、Music() if (mediaPlayer != null) if(isPlaying = false)mediaPlayer.start();isPlaying = true ;创建playmusic类中在textview中进行显示显示正在播放的音乐文件名代码片段:protected void onResume() / TODO Auto-generated method stubsuper.onResume();/ TextView对象,设置正在播放的歌曲的名字if (PlayMusicService.isPlaying = false) currentSong = playMusic

22、Service.CURRENT_SONG;updatePlaySongName(PlayMusicService.CURRENT_SONG);/ 更新正在TextView对象public void updatePlaySongName(int position) textView.setText(LocalListActivity.list.get(position).get(mp3Name);待添加的隐藏文字内容34、创建LocallistActivity类用listview显示本地音乐文件以及local_listview.xml。local_listview.xml代码片段:Localli

23、stActivity类实现OnItemClickListener接口 定义一些MP3的信息变量private static final int TAG_SIZE = 128;private static final int TITLE_SIZE = 30;private static final int ARTIST_SIZE = 30;private static final int ALBUM_SIZE = 30;private static final int YEAR_SIZE = 4;private static final String TAG_START = TAG;privat

24、e ListView listView = null;定义被点击的歌曲的位置:public static int currentSong = 0;定义一个list数组用以存储歌曲列表信息:public static ListHashMap list = null;重写onResume获取点击音乐的焦点事件:Overrideprotected void onResume() / TODO Auto-generated method stubsuper.onResume();try showLocalListView(FileUtils.MUSIC); catch (Exception e) /

25、TODO Auto-generated catch blocke.printStackTrace();创建文件过滤器,过滤非以mp3结尾的文件private FilenameFilter fileFilter = new FilenameFilter()public boolean accept(File path,String name)return (name.endsWith(.mp3);显示本地歌曲列表public void showLocalListView(String path) throws Exception listView= (ListView) this.findVie

26、wById(R.id.local_listview);list = new ArrayListHashMap();HashMap map = null;File musicDir = new File(path);File files = musicDir.listFiles(fileFilter);for (int i = 0; i files.length; i+) String filePath = filesi.getParent() + File.separator+ filesi.getName();File mp3 = new File(filePath);byte buf =

27、new byteTAG_SIZE;RandomAccessFile raf = new RandomAccessFile(mp3, r);raf.seek(raf.length() - TAG_SIZE);raf.read(buf, 0, TAG_SIZE);String tag = new String(buf, 0, TAG_SIZE, gbk);map = new HashMap();map.put(mp3Name, mp3.getName(); /获取MP3信息map.put(mp3Author, tag.substring(33, 63).trim();list.add(map);创

28、建一个simpleAdapter适配器和点击Item触发service中的播放音乐事件:SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,R.layout.local_item,new String mp3Name ,mp3Author, new int R.id.mp3Name ,R.id.mp3Author); listView.setAdapter(simpleAdapter);listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);listView.setOnItem

29、ClickListener(this);/点击ListView的Item时触发的时间public void onItemClick(AdapterView av, View v, int position, long id) / TODO Auto-generated method stubIntent serviceIntent = new Intent(this, PlayMusicService.class);Bundle b = new Bundle();/记录当前播放歌曲的位置currentSong = position ;/将被点击的歌曲的当前位置传递到service中b.putI

30、nt(position, currentSong);serviceIntent.putExtras(b);startService(serviceIntent);/跳转到第二标签卡 TabViewActivity.tabHost.setCurrentTab(1); /更新正在播放歌曲名字 new PlayingMusicActivity().updatePlaySongName(currentSong);5、 创建一个与打接电话时音乐后台停止并且记住播放点,当打接电话完毕音乐继续播放的类继承BroadcastReceiver类。该类的相关代码片段:public void onReceive(C

31、ontext context, Intent intent) /* * 当来电或去电时,则暂停播放音乐 */if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL) /去电时暂停new PlayMusicService().pauseMusic(); else TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);/来电时暂停switch (tm.getCallState() case TelephonyManager.CALL_STATE_RINGING:new PlayMusicService().pauseMusic();break ;6、对于Androidmainfest.xml注册文件的配置。1) 注册来电、去电的监听器2)添加来电读取权限3)添加监听去电的读取权限 总结:首先应该说一句的是:要感谢这次课程设计,因为通过这次课程设计让我对Android的开发又有了更进一步的认识,例如以前不懂的tabhost布局这个容器通过这次例子我明白了它在

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号