Mp3播放器项目实践.docx

上传人:小飞机 文档编号:1701513 上传时间:2022-12-15 格式:DOCX 页数:49 大小:569.42KB
返回 下载 相关 举报
Mp3播放器项目实践.docx_第1页
第1页 / 共49页
Mp3播放器项目实践.docx_第2页
第2页 / 共49页
Mp3播放器项目实践.docx_第3页
第3页 / 共49页
Mp3播放器项目实践.docx_第4页
第4页 / 共49页
Mp3播放器项目实践.docx_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《Mp3播放器项目实践.docx》由会员分享,可在线阅读,更多相关《Mp3播放器项目实践.docx(49页珍藏版)》请在三一办公上搜索。

1、Mp3播放器项目 项目功能简介: 环境配置:服务器:tomcatXML文件:resources.xml(用来记录服务器中所有歌曲信息)Mp3文件和LRC文件1、将resources.xml文件、Mp3文件和LRC文件都放置到tomcat-webapps-Mp3.2、在tomcat-webapps-Mp3中建立WEB-INF文件夹(添加配置文件web.xml)3、在eclipse中启动tomcat,并在浏览器中实验是否能正确访问到以上文件(http:/localhost:8080/Mp3/resources.xml )注意:每次启动eclipse后要运行这个程序的话,别忘了启动tomcat啊!否

2、则读取不了服务器中的Mp3列表的。第一集: 实现Mp3文件列表的显示-点击menu-出现更新列表按钮,点击更新列表按钮,可以显示服务器中所有的歌曲信息功能分解:1、 menu按钮显示2、 从服务器下载resources.xml3、 用SAX方法解析resources.xml: ContentHandler类的设计; SAX解析;功能实现:1、 创建类Mp3ListActivity 重写回调函数public boolean onCreateOptionsMenu(Menu menu) 实现menu按钮显示功能: public boolean onCreateOptionsMenu(Menu me

3、nu) menu.add(0, UPDATE, 1, R.string.mp3list_update);menu.add(0, ABOUT, 2, R.string.mp3list_about);return super.onCreateOptionsMenu(menu); 注意点: 在类中,元素的ID最好定义一个常量来代替实际的int型数据,以便修改。如:UPDATE ABOUT2、 创建HttpDownloader类,实现xml文本文件的下载功能:import .*;import java.io.*;import org.apache.http.HttpConnection;public

4、class HttpDownloader public InputStream getInput(URL url)HttpURLConnection httpconn=null;InputStream input = null;try httpconn=(HttpURLConnection)url.openConnection();input=httpconn.getInputStream(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return input;public Strin

5、g textDownload(String urlStr) URL url;InputStream input = null;StringBuffer sb = new StringBuffer();String line = null;BufferedReader buffer = null;try url = new URL(urlStr);input=getInput(url);buffer = new BufferedReader(new InputStreamReader(input,gb2312);while (line = buffer.readLine() != null) s

6、b.append(line);/注意:此处一定要用一个line进行append,否则会读取数据不完整/注意:记得将 InputStreamReader中的编码设置为gb2312,否则不可读取中文 catch (Exception e) e.printStackTrace(); finally try buffer.close(); catch (Exception e) e.printStackTrace();return sb.toString();注意:要在AndroidManifest中添加访问internet的权限:3、 创建Mp3ListContentHandler类,实现Conte

7、ntHandler类的设计,以便xml的解析用。4、 在解析resources.xml时,将每一个Mp3看做一个对象,即:.之间子元素是这个Mp3对象 中的私有变量。因此还需要创建一个Mp3Info类,以实现在xml文件解析过程中对每个Mp3的属性进行存储:public class Mp3Info private String id;private String mp3Name;private String mp3Size;private String lrcName;private String lrcSize;/* * 直接右击然后source 选择生成get和set方法以及toStrin

8、g方法以及构造函数(带参数和不带参数的构造函数) * return */public Mp3Info() super();public Mp3Info(String id, String mp3Name, String mp3Size, String lrcName,String lrcSize) super();this.id = id;this.mp3Name = mp3Name;this.mp3Size = mp3Size;this.lrcName = lrcName;this.lrcSize = lrcSize;public String getId() return id;publi

9、c void setId(String id) this.id = id;public String getMp3Name() return mp3Name;public void setMp3Name(String mp3Name) this.mp3Name = mp3Name;public String getMp3Size() return mp3Size;public void setMp3Size(String mp3Size) this.mp3Size = mp3Size;public String getLrcName() return lrcName;public void s

10、etLrcName(String lrcName) this.lrcName = lrcName;public String getLrcSize() return lrcSize;public void setLrcSize(String lrcSize) this.lrcSize = lrcSize;Overridepublic String toString() return Mp3Info id= + id + , mp3Name= + mp3Name + , mp3Size=+ mp3Size + , lrcName= + lrcName + , lrcSize= + lrcSize

11、+ ;注意点:在编程中,对于这种专门用于存储某种实体对象的属性的类,都可用上面这种方法进行处理:将每个属性定义为一个私有变量;利用eclipse自动生成get函数、set函数和构造函数的功能,生成所需函数利用eclipse自动生成toString函数,以便调试使用 5、 创建Mp3ListContentHandler类,以便设置SAX解析时的Handler:import java.util.List;import liu.model.Mp3Info;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.

12、xml.sax.helpers.DefaultHandler;public class Mp3ListContentHandler extends DefaultHandlerprivate Mp3Info mp3info=null;private List infos=null;/用于存放各个的Mp3对象private String tagName=null;public List getInfos() return infos;public void setInfos(List infos) this.infos = infos;public Mp3ListContentHandler(L

13、ist infos) super();this.infos = infos;Overridepublic void characters(char ch, int start, int length)throws SAXException String temp=new String(ch,start,length);if(tagName.equals(id)mp3info.setId(temp);else if(tagName.equals(mp3.name)mp3info.setMp3Name(temp);else if(tagName.equals(mp3.size)mp3info.se

14、tMp3Size(temp);else if(tagName.equals(lrc.name)mp3info.setLrcName(temp);else if(tagName.equals(lrc.size)mp3info.setLrcSize(temp);/每解析到的endElement时,表示一个Mp3对象解析完成,故将这个mp3info对象放到infos中Overridepublic void endElement(String uri, String localName, String qName)throws SAXException if(localName.equals(reso

15、urce)infos.add(mp3info);tagName=;Override/每解析到一个的startElement时候,表示一个新的Mp3对象将被解析到,故创建新的Mp3Info对象来存储Mp3对象public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException tagName=localName;if(tagName.equals(resource)mp3info=new Mp3Info();Overridepublic void

16、 endDocument() throws SAXException / TODO Auto-generated method stubsuper.endDocument();Overridepublic void startDocument() throws SAXException / TODO Auto-generated method stubsuper.startDocument();6、 在Mp3ListActivity类中添加解析xml的方法: private List parse(String xmlStr)SAXParserFactory factory = SAXParse

17、rFactory.newInstance();XMLReader reader;List infos = null;try reader = factory.newSAXParser().getXMLReader();infos=new ArrayList();Mp3ListContentHandler mp3listhandler=new Mp3ListContentHandler(infos);reader.setContentHandler(mp3listhandler);reader.parse(new InputSource(new StringReader(xmlStr);/使用迭

18、代器Iterator遍历infos中的各个Mp3对象,快捷键:输入for以后/按下alt+/for(Iterator iterator=infos.iterator();iterator.hasNext();)Mp3Info mp3info=(Mp3Info) iterator.next();System.out.println(mp3info); catch (SAXException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (ParserConfigurationException e) / TODO A

19、uto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return infos; 7、调用上述方法和各个类,实现点击更新列表按钮来读取服务器中resources.xml文件中各个Mp3信息的功能,在Mp3ListActivity类中添加以下两个方法:public boolean onOptionsItemSelected(MenuItem item) if(item.getItemId()=UPDATE)/注

20、意:Android的本地地址不是127.0.0.1 而是10.0.2.2String xml=downloadXML(http:/10.0.2.2:8080/Mp3/resources.xml);System.out.println(xml-+xml);parse(xml);else if(item.getItemId()=ABOUT)/点击关于return super.onOptionsItemSelected(item); private String downloadXML(String urlStr)HttpDownloader httpdownloader=new HttpDownl

21、oader();String result=httpdownloader.textDownload(urlStr);return result;8、 利用ListView的知识,将得到的mp3infos的相关信息显示在ListActivity中。在Mp3ListActivity类的点击更新列表的相应事件中添加如下代码。另外,新建main.xml和mp3info_item.xml来布局ListActivitypublic boolean onOptionsItemSelected(MenuItem item) if(item.getItemId()=UPDATE)/点击更新列表String xm

22、l=downloadXML(http:/10.0.2.2:8080/Mp3/resources.xml);System.out.println(xml-+xml);List infos;ArrayListHashMap list = new ArrayListHashMap();infos=parse(xml);for(Iterator iterator=infos.iterator();iterator.hasNext();)Mp3Info mp3Info=(Mp3Info) iterator.next();System.out.println(mp3Info);HashMap mp3=ne

23、w HashMap();mp3.put(mp3_name, mp3Info.getMp3Name();mp3.put(mp3_size, mp3Info.getMp3Size();list.add(mp3);SimpleAdapter simple=new SimpleAdapter(this, list,R.layout.mp3info_item, new String mp3_name,mp3_size, new intR.id.mp3_name,R.id.mp3_size);setListAdapter(simple);else if(item.getItemId()=ABOUT)/点击

24、关于return super.onOptionsItemSelected(item);Main.xml: Mp3info_item.xml: 编程思想:实现相应的功能只是很小的一部分,对代码进行重构是很重要的一部分工作!重构:提高代码的可复用性,减少重复性代码,提高代码的可扩展性,以便以后代码的修改和功能的扩展。函数越小越好!重构Mp3ListActivity类中的函数,将回调函数中繁杂的功能实现函数封装成单独的函数,在回调函数中直接调用,最终得到Mp3ListActivity类的代码如下:import java.io.IOException;import java.io.StringRead

25、er;import .*;import java.util.*;import javax.xml.*;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import liu.download.HttpDownloader;import liu.model.Mp3Info;i

26、mport liu.xml.Mp3ListContentHandler;import android.os.Bundle;import android.app.Activity;import android.app.ListActivity;import android.view.Menu;import android.view.MenuItem;import android.widget.SimpleAdapter;import android.support.v4.app.NavUtils;public class Mp3ListActivity extends ListActivity

27、private static final int UPDATE=1;private static final int ABOUT=2; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); updateListView(); Overridepublic boolean onCreateOptionsMenu(Menu menu) menu.add(0, UPDATE, 1, R.string.mp3l

28、ist_update);menu.add(0, ABOUT, 2, R.string.mp3list_about);return super.onCreateOptionsMenu(menu);private SimpleAdapter buildSimpleAdapter(List mp3infos)ArrayListHashMap list = new ArrayListHashMap();for(Iterator iterator=mp3infos.iterator();iterator.hasNext();)Mp3Info mp3Info=(Mp3Info) iterator.next

29、();System.out.println(mp3Info);HashMap mp3=new HashMap();mp3.put(mp3_name, mp3Info.getMp3Name();mp3.put(mp3_size, mp3Info.getMp3Size();list.add(mp3);SimpleAdapter simple=new SimpleAdapter(this, list,R.layout.mp3info_item, new String mp3_name,mp3_size, new intR.id.mp3_name,R.id.mp3_size);return simpl

30、e;private void updateListView()/注意:1、tomcat服务器中文件放置:在webapps下新建Mp3文件,在Mp3文件中新建配置文件WEB-INF/在Mp3文件中放置工程中需要下载和用到的文件/2、Android的本地地址不是127.0.0.1 而是10.0.2.2String xml=downloadXML(http:/10.0.2.2:8080/Mp3/resources.xml);List mp3infos=parse(xml);SimpleAdapter simple=buildSimpleAdapter(mp3infos);setListAdapter

31、(simple);Overridepublic boolean onOptionsItemSelected(MenuItem item) if(item.getItemId()=UPDATE)/点击更新列表updateListView();else if(item.getItemId()=ABOUT)/点击关于return super.onOptionsItemSelected(item); private String downloadXML(String urlStr)HttpDownloader httpdownloader=new HttpDownloader();String res

32、ult=httpdownloader.textDownload(urlStr);return result;private List parse(String xmlStr)SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader reader;List infos = null;try reader = factory.newSAXParser().getXMLReader();infos=new ArrayList();Mp3ListContentHandler mp3listhandler=new Mp3Lis

33、tContentHandler(infos);reader.setContentHandler(mp3listhandler);reader.parse(new InputSource(new StringReader(xmlStr);/*for(Iterator iterator=infos.iterator();iterator.hasNext();)Mp3Info mp3info=(Mp3Info) iterator.next();System.out.println(mp3info);*/ catch (SAXException e) / TODO Auto-generated cat

34、ch blocke.printStackTrace(); catch (ParserConfigurationException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return infos;第二集:实现点击ListView中的一个List,可以下载该List中对应的Mp3文件功能分解:1、 得到用户想要下载的mp3文件的名称2、 访问网络下载文件: 需要创建一个Ser

35、vice 在Service中进行下载注意:在AndroidManifest中进行Service的注册: 需要在独立的线程中进行下载 需要将下载的文件写入sdcard中去(注意对sdcard的操作需要在AndroidManifest中声明权限)3、 通知用户下载结果功能实现1、 在Mp3ListActivity类中覆写 protected void onListItemClick()方法,通过mp3infos的position得到用户要下载的Mp3文件2、 新建将文件写入sdcard中的类SdcardWrite: public class SdcardWrite private String S

36、DPATH;public SdcardWrite()SDPATH=Environment.getExternalStorageDirectory()+/;public File createDir(String dirName)File dir=new File(SDPATH+dirName+File.separator);dir.mkdirs();return dir;public boolean isFileExist(String dirName,String fileName)File file=new File(SDPATH+dirName+fileName+File.separator);return file.exists();public File createFile(String dir,String fileName)File file=new File(SDPATH+dir+fileName+File.separator);try file.createNewFile(); catch (I

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号