1、 11.1功能需求分析1.1.1播放器的基本功能1.1.2功能需求时序分析 21.2系统结构流程图 31.3系统界面需求1.4开发环境 42、音乐播放器详细设计与实现2.1播放器界面设计2.2获取并解析XML文件 62.3下载MP3文件 92.4播放MP3文件 101、系统需求分析1.1功能需求分析根据项目的目标,我们可获得项目系统的基本需求,一下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,播放器的基本控制需求。以下分别描述:1.1.1播放器的基本功能退出图4-1 播放器基本控制图在播放器运行时,主界面是服务器的歌曲列表,可以点击刷新列表,也可以点击歌曲名,开始下载歌曲,
2、然后点击本地歌曲列表可以显示出本地的歌曲文件,点击文件名则跳转到播放界面,在播放界面可以控制歌曲的播放、暂停、停止以及返回本地歌曲列表。1.1.2功能需求时序分析图4-2 音乐播放器的时序图从以上时序图可以看到播放器中消息发送及调用过程。1.2系统结构流程图图4-3 音乐播放器系统流程图以上显示了播放器的各个流程。1.3系统界面需求播放器界面要求布局合理,简约,颜色舒适,控制按钮友好,能让用户一眼就能看出各个按钮的作用及操作方法。能实现要求的功能,但又不重复。要考虑到不同手机屏幕大小可能不一样,应尽量兼容大多数手机屏幕尺寸,使之显示无障碍。1.4开发环境操作系统:Windows7 x64。开发
3、环境:Eclipse Version: Indigo Service Release 1ADT Version: 16.0.1运行环境:Android 2.22、音乐播放器详细设计与实现2.1播放器界面设计首先是创建一个主界面MainActivity,它使用TabHost布局,这里面的TabWidget控件控制着两个Activity的互相切换:一个是Mp3PlayerListActivity(图5-1),这个Activity是一打开程序就显示的服务器歌曲列表。图5-1 Mp3PlayerListActivity另一个是LocalActivity(图5-2),这个Activity是点击TabWi
4、dget控件中的“本地”按钮才会显示的本地歌曲列表界面。图5-2 LocalActivity在LocalActivity中点击列表中的歌曲名就会调出PlayerActivity(图5-3),这个Activity就是播放音乐时的界面,其中有一些对播放器进行控制的控件。图5-3 PlayerActivity详细设计代码见附录。2.2获取并解析XML文件因为打开播放器首先就要刷新服务器上的歌曲列表,那么我们就得获取服务器上的歌曲列表文件,即XML文件。实现代码如下:/ 根据URL下载文本文件,必须是文本文件,因为返回值是文本中的字符public String download(String urlS
5、tr) StringBuilder sb = new StringBuilder();String line = null;BufferedReader buffer = null;try / 创建一个URL对象URL url = new URL(urlStr);/ 创建一个http连接HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();/ 使用io读取数据buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream();/
6、一行行的读取数据while (line = buffer.readLine() != null) sb.append(line); catch (Exception e) e.printStackTrace(); finally / 关闭buffer 节约资源buffer.close(); catch (Exception e2) e2.printStackTrace();/将读取到的文本文件中的内容传回去return sb.toString();从服务器上下载到XML中的文本后就要开始解析,在开始解析之前我们先来了解一下服务器上用来保存歌曲信息的XML文件。图5-2 XML文件结构图从上图中
7、可以看出所有的歌曲信息是包含在一个resources标签当中的,而每一个resource标签就代表一首歌曲,其中的id、mp3.name、lrc.name、lrc.size标签都分表代表了歌曲的一条信息。在我所设计的播放器中所用到是实现SAX(Simple API for XML)接口的方式来解析XML文件,解析的实现代码如下:/开始解析XML文件中的每一个标签时调用的方法Overridepublic void startElement(String uri, String localName, String qName,Attributes attr) throws SAXException
8、 /将从XML文件中读取到的标签名赋值给tagNametagName = localName;/如果标签名为resource时 就创建一个mp3Info的实例对象if (tagName.equals(resource) mp3Info = new Mp3Info();/解析完XML文件中的每一个标签时调用的方法public void endElement(String uri, String localName, String qName)throws SAXException /每次读取到resource标签就代表一首歌曲的信息已经完成,并将次mp3Info加到infos当中if (qNam
9、e.equals(infos.add(mp3Info);/每读完一个标签就清空tagName,以免出错tagName = ;/读取XML文件中没一个标签中内容public void characters(char ch, int start, int length)/将读取到的内容赋值给tempString temp = new String(ch, start, length);/将每个标签中的内容赋值给mp3Info实例对象中相应的变量idmp3Info.setId(temp); else if (tagName.equals(mp3.namemp3Info.setMp3Name(temp
10、);mp3.sizemp3Info.setMp3Size(temp);lrc.namemp3Info.setLrcName(temp);lrc.sizemp3Info.setLrcSize(temp);2.3下载MP3文件根据URL的地址从服务器上下载文件,因为下载不可能是一瞬间就能完成的事,如果我们在主线程中进行下载,那么下载过程中程序就会出现假死状态,因为它在等待文件下载完成,下载完成才能执行后面的操作,所以我们需要用一个线程来进行下载任务,实现代码如下:/ 每次用户点击ListActivity当中的一个条目时,就会调用该方法public int onStartCommand(Intent
11、 intent, int flags, int startId) / 从Intent对象当中将Mp3Info对象取出Mp3Info mp3Info = (Mp3Info) intent.getSerializableExtra(mp3Info);/ 生成一个下载线程,并将Mp3Info对象作为参数传递到线程对象当中DownloadThread downloadThread = new DownloadThread(mp3Info);/ 启动新线程Thread thread = new Thread(downloadThread);thread.start();return super.onStartCommand(intent, flags, startId);class DownloadThread implements Runnable
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1