《[电脑基础知识]Android1网络视频播放器.doc》由会员分享,可在线阅读,更多相关《[电脑基础知识]Android1网络视频播放器.doc(37页珍藏版)》请在三一文库上搜索。
1、1 网络视频播放器 小安:博士,公司又上新项目了? 大致博士:小安,什么项目这么紧张啊 。 小安:是一个基于Android系统的视频播放客户端 大致博士:这很好啊,可以将你所学的都展示出来呀,很多知识要点都已经传授给你了。 小安:但是,还是没有信心呀!还有很多的问题呀,博士。 大致博士:那好吧!那就给你介绍一个简单的实现网络视频播放器的demo,讲一下它的核心部分。你要用心听啊!1.1 项目概述 基于Android客户端的网络视频播放器,实现了网络(服务器)端视频文件分类列表显示,下载并存储在手机SD卡中,随时进行播放。1.2 项目目的掌握Andorid页面UI设计 掌握SAX解析XML文件
2、掌握基于android平台多线程、断点下载 掌握视频多媒体播放 1.3 项目实现流程1.3.1 服务器端 服务器说明及搭建方法:第一, 将光盘中xxx下的工程导入Eclipse中,步骤如下。点击【File】【Import】,之后选择【General】下的【Existing Projects into Workspace】,点击【Next】,通过【Browse】定位到该工程的位置。之后点击【Finish】。导入完成。第二, 将该项目发布到Tomcat服务器上。右击该项目名,选择【Run As】【Run on Server】,如下图:之后点击【Finish】,此时,在浏览器中访问“http:/lo
3、calhost:8080/SharpVideo/”地址,可以得到如下界面。说明服务器已经成功运行。其中,之前六个以“.jsp”结尾的超链接分别对应服务器端程序中的六个Jsp文件,每个Jsp文件可以返回一个XML格式的结果,供手机客户端程序解析。而后面的“picture/”和“video/”两个超链接对应服务器端程序中的两个文件夹,分别存放图片和视频。getSharpCategory.jsp:返回该服务器端所有视频栏目的信息以及该栏目对应的标示图片及访问该类型的所有视频的列表地址。返回结果格式如下: 4 1 经典 http:/localhost:8080/SharpVideo/picture/i
4、con/jingdian.png http:/localhost:8080/SharpVideo/getSharpVideoByCategroyid1.jsp 1 0 getSharpVideo.jsp:返回所有视频信息。返回结果格式如下: 20 315 万山红_红歌_山丹丹开花红艳艳_镜头版 2010-05-03 16:13:03.0 万山红_红歌_山丹丹开花红艳艳_镜头版 sharpandroid http:/localhost:8080/SharpVideo/picture/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_j
5、ingtouban.jpg 10 10 万山红_红歌_山丹丹开花红艳艳_镜头版 10 http:/localhost:8080/SharpVideo/video/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_jingtouban.mp3 http:/localhost:8080/SharpVideo/video/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_jingtouban.mp3 至于后面四个“.jsp”文件返回的分别是不同栏目的视频信息,格式与getSha
6、rpVideo.jsp的结果一致。1.3.2 UI页面设计 主页面 具体代码 补充完整 具体代码为: 频道页面具体代码补充完整 对话框页面 图片和具体代码补充完整 下载页面显示: 具体代码代码为: 已下载列表界面: 播放页面:具体代码代码为 代码为: 1.3.3 XML解析 文件结构:在本应用中从服务器端信息都是以XML形式获得,这里就在所难免的需要使用前面章节讲到的XML解析相关应用。实体类首先需要我们根据需求写出相应的实例类。结合本例,需要解析的有两个实体。1:当用户发出请求需要获得内容列表时,解析视频信息需要的视频对象。2:当用户发出请求需要获得内容分类时,解析分类信息需要的分类对象。c
7、om.sharpandroid_video.channel.entity+Video.java+Category.javaHandler类使用SAX解析,在处理不同类型的XML时就需要不同的Handler类,这是SAX解析的特点。com.sharpandroid_video.channel.entity.xml+ChannelHandler.java+VideoHandler.java由于从服务器得到的XML的结构较为简单,在重写Handler时,没必要重写无关的事件,ChannelHandler.java代码如下:package com.sharpandroid_video.channel.
8、entity.xml;import java.util.ArrayList;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.sharpandroid_video.channel.entity.Category;public class ChannelHandler extends DefaultHandler private String content;private Category current=new Category();public ArrayList cha
9、nnels=new ArrayList();Overridepublic void characters(char ch, int start, int length)throws SAXException String part=new String(ch,start,length);if(!part.equals(n)if(content!=null)content+=part;elsecontent=part;Overridepublic void endElement(String uri, String localName, String name)throws SAXExcepti
10、on if(categoryid.equalsIgnoreCase(localName)current.setCategoryid(content);else if(regularIcon.equalsIgnoreCase(localName)current.setRegularIcon(content);else if(AltIcon.equalsIgnoreCase(localName)current.setAltIcon(content);else if(Thumbnail.equalsIgnoreCase(localName).channels.add(current);current
11、=new Category();content=null;大家可以看到,本例里只是重写了characters(),endElement()两个事件,就完成了需求。这是值得注意的,在开发过程中并不是所有的Handler事件都要重写的,结合你需要解析的XML特点,编写以最简洁的方式完成自己的应用,才是最佳方式。VideoHandler.java的编写类似,故不再赘述。方法实现:com.sharpandroid_video.helper+ParserXML.java在实体类,Handler类编写完毕,就是整体的实现过程,下面给出获得“推荐内容”XML文件的过程。其他方法类同。public stati
12、c ArrayList TopVideoList() try VideoHandler handler=new VideoHandler();String http = http:/192.168.1.188:8080/SharpVideo/getSharpVideo.jsp;InputStream input=new URL(http).openStream();SAXParser sp = spf.newSAXParser();XMLReader reader = sp.getXMLReader();reader.setContentHandler(handler); InputSourc
13、e inputSource=new InputSource(input); reader.parse(inputSource); input.close(); return handler.videos; catch (Exception e) e.printStackTrace();return null;1.3.4 视频文件下载 下载模块概述为了实现视频的播放,需要将文件从网络下载到本地,将文件存储在手机的SD卡中,之后再随时读取SD卡中的文件,实现文件的播放。在下载中为了提高运行的效率和用户的体验,我们依然采取多线程、断点的方式,在之前的网络一章中已经重点介绍了如何实现多线程、断点下载,
14、下面我们就来进一步完善它。说明:由于此模块是在以前多线程、断点功能上完善,很多代码都是重复的,而且数量是很多的。此节只介绍了关键代码,有些删减的代码需要回顾网络一篇多线程、断点下载。望理解。 实现流程: 在BrowserActivity界面中弹出buildDialog对话框-下载DownLoaderActivity界面 -点击【下载】Button-断点、多线程下载-点击【暂停(删除)】Button-下载暂停(删除)-点击【返回首页】Button-回到首页界面-点击【已下载列表】Button-转到已经文件界面实现思路:1. 在实现断点、多线程的基础上传入一个唯一标识位实现下载的暂停和删除。2.
15、将已经下载的文件存入到SD卡的同时,新建一个数据库表,存入下载文件的相关信息。3. 点击【已下载列表】按钮通过Intent跳转到已下载目录,并显示已下载文件信息。4. 点击已下载文件的任意信息,跳转到播放的界面,实现本地播放。5. 点击【返回首页】按钮通过Intent跳转到首页。 下载模块的下载文件的下载将采用多线程、断点的方式,相关知识已经在网络一篇有很详细的介绍,这里就不再过多赘余,下面是实现下载的时序图:如有不清楚请回顾网络一章,现在要在此基础上实现下载的暂停和删除操作。 下载模块的暂停首先需要了解下载过程中线程的相互关系:1. 主进程(主线程)开启了一个download线程 。2. d
16、ownload线程又开启了三条用于真正下载的线程。它们在工作的过程中是独立的,并发的执行流,当要暂停下载操作时,需要同时听停止三条真正下载的线程,在线程中已经为我们提供了类似的方法,但是这里我们使用标记位的方式来实现。当点击下载的同时给其绑定一个Map值,其key为每一个下载资源的path,values为每一个下载传入一个Boolean 的值,true 或者 false。当我们点击【下载】时会同时也把这个标记值传过去,在实现下载的DownloadThread类中进行判断,如果传入是true则下载。反之点击【暂停】时,传入是false则暂停。注意: 在暂停时不要单一的去暂停当前下载的线程,因为操
17、作系统是采用的是效率更高的抢占式多任务策略,如果你停了其中的一个,还有两个可以抢占cpu资源继续下载,所以我们根据它的唯一标记url来判断,则可以同时将其停止。 编写DownLoaderActivity.java代码: (完整)package com.sharpandroid_video.download.download.activity;public class DownLoaderActivity extends Activity private static final String TAG = DownLoaderActivity;private EditText pathEditT
18、ext;private ProgressBar progressBar;private TextView resultView;private Button button_download;private Button button_pause;private Button button_delete; private Button button_already; private Button button_back;private FileDownloader downloader;private FileService fileService;public static Map flags
19、 = new HashMap(); /首先定义静态的标志位:public static int isDowning = 0;/0 未下载, 1正在下载 ,2 暂停 ,3 下载完成 private Handler handler = new Handler() Overridepublic void handleMessage(Message msg) if (!Thread.currentThread().isInterrupted() switch (msg.what) case 1:int size = msg.getData().getInt(size);String fileloadp
20、ath = msg.getData().getString(stringbuilder);progressBar.setProgress(size);int result = (int) (float) progressBar.getProgress() / (float) progressBar.getMax() * 100);resultView.setText(result + %);if (progressBar.getMax() = progressBar.getProgress() setTitle(下载成功);showToastString(下载成功);isDowning = 3
21、; fileService = new FileService(DownLoaderActivity.this); InternetFile internetFile = new InternetFile(); internetFile.setName(FileDownloader.filename); internetFile.setSavepath(fileloadpath); try fileService.save(internetFile); catch (Exception e) e.printStackTrace(); break;case -1:String error = m
22、sg.getData().getString(error);showToastString(error);break;super.handleMessage(msg); 说明l String fileloadpath = msg.getData().getString(stringbuilder);在主页面中得打下载的路径,l fileService = new FileService(DownLoaderActivity.this); 得到fileService对象,调用下载文件的业务方法。l InternetFile internetFile = new InternetFile();下载
23、文件的实体l internetFile.setName(FileDownloader.filename);得到下载文件的名字,并给实体赋值 internetFile.setSavepath(fileloadpath); 得到下载文件的目录,并给实体赋值 fileService.save(internetFile); 调用数据库的save保存方法,将文件实体保存到数据库中。 Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layo
24、ut.downloader);Intent intent =this.getIntent();final String path = intent.getExtras().getString(url).trim();pathEditText = (EditText) this.findViewById(R.id.path);pathEditText.setText(path); progressBar = (ProgressBar) findViewById(R.id.progressBar);resultView = (TextView) findViewById(R.id.result);
25、/* * 下载操作 */button_download = (Button) findViewById(R.id.button_download);button_download.setOnClickListener(new View.OnClickListener() /* * 0未下载, 1正在下载 ,2 暂停 ,3 下载完成 * 下载文件,并保存到SDCard */Overridepublic void onClick(View v) setTitle(正在下载中);if(isDowning =1)showToastString(正在下载中!);if(isDowning = 0 | is
26、Downing =2) if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) try flags.put(path, true);download(path, Environment.getExternalStorageDirectory();/ 1isDowning = 1;showToastString(开始下载!); catch (Exception e) showToastString(网络连接失败!);Log.e(TAG, e.toString(); else showToastStri
27、ng(SD卡出现错误!););说明l public static int isDowning = 0;定义下载文件的状态,0未下载, 1正在下载 ,2 暂停 ,3 下载完成 l if(isDowning =1)showToastString(正在下载中!);如果正在下载中Toast显示出“正在下载中!”;l if(isDowning = 0 | isDowning =2)如果尚未下载或是下载暂停就开始下载工作l flags.put(path, true);flags作为标志位,在下载时将其Value设定为true,在下载的DownloadThread.java中进行判断当前falg的值,并将其作为下载的条件。 /* * 暂停操作 */button_pause = (Button) this.findViewById(R.id.button_pause);button_pause.setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View v) setTitle(暂停下载);try /0 未下载, 1正在下载 ,2 暂停 ,3 下载完成 switch
链接地址:https://www.31doc.com/p-1987434.html