Android1网络视频播放器.docx

上传人:b****3 文档编号:5443908 上传时间:2022-12-16 格式:DOCX 页数:44 大小:627.40KB
下载 相关 举报
Android1网络视频播放器.docx_第1页
第1页 / 共44页
Android1网络视频播放器.docx_第2页
第2页 / 共44页
Android1网络视频播放器.docx_第3页
第3页 / 共44页
Android1网络视频播放器.docx_第4页
第4页 / 共44页
Android1网络视频播放器.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

Android1网络视频播放器.docx

《Android1网络视频播放器.docx》由会员分享,可在线阅读,更多相关《Android1网络视频播放器.docx(44页珍藏版)》请在冰豆网上搜索。

Android1网络视频播放器.docx

Android1网络视频播放器

1网络视频播放器

小安:

博士,公司又上新项目了?

大致博士:

小安,什么项目这么紧张啊。

小安:

是一个基于Android系统的视频播放客户端

大致博士:

这很好啊,可以将你所学的都展示出来呀,很多知识要点都已经传授给你了。

小安:

但是,还是没有信心呀!

还有很多的问题呀,博士。

大致博士:

那好吧!

那就给你介绍一个简单的实现网络视频播放器的demo,讲一下它的核心部分。

你要用心听啊!

1.1项目概述

基于Android客户端的网络视频播放器,实现了网络(服务器)端视频文件分类列表显示,下载并存储在手机SD卡中,随时进行播放。

1.2项目目的

掌握Andorid页面UI设计

掌握SAX解析XML文件

掌握基于android平台多线程、断点下载

掌握视频多媒体播放

1.3项目实现流程

1.3.1服务器端

服务器说明及搭建方法:

第一,将光盘中xxx下的工程导入Eclipse中,步骤如下。

点击【File】【Import】,之后选择【General】下的【ExistingProjectsintoWorkspace】,点击【Next】,通过【Browse】定位到该工程的位置。

之后点击【Finish】。

导入完成。

第二,将该项目发布到Tomcat服务器上。

右击该项目名,选择【RunAs】【RunonServer】,如下图:

之后点击【Finish】,此时,在浏览器中访问“http:

//localhost:

8080/SharpVideo/”地址,可以得到如下界面。

说明服务器已经成功运行。

其中,之前六个以“.jsp”结尾的超链接分别对应服务器端程序中的六个Jsp文件,每个Jsp文件可以返回一个XML格式的结果,供手机客户端程序解析。

而后面的“picture/”和“video/”两个超链接对应服务器端程序中的两个文件夹,分别存放图片和视频。

getSharpCategory.jsp:

返回该服务器端所有视频栏目的信息以及该栏目对应的标示图片及访问该类型的所有视频的列表地址。

返回结果格式如下:

4

1

经典

http:

//localhost:

8080/SharpVideo/picture/icon/jingdian.png

http:

//localhost:

8080/SharpVideo/getSharpVideoByCategroyid1.jsp

1

0

…………

getSharpVideo.jsp:

返回所有视频信息。

返回结果格式如下:

20

315

万山红_红歌_山丹丹开花红艳艳_镜头版

2010-05-0316:

13:

03.0

万山红_红歌_山丹丹开花红艳艳_镜头版

sharpandroid

http:

//localhost:

8080/SharpVideo/picture/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_jingtouban.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”文件返回的分别是不同栏目的视频信息,格式与getSharpVideo.jsp的结果一致。

1.3.2UI页面设计

主页面具体代码补充完整

具体代码为:

频道页面

 

具体代码补充完整

对话框页面

图片和具体代码补充完整

下载页面显示:

具体代码代码为:

xmlversion="1.0"encoding="utf-8"?

>

android="

android:

orientation="vertical"

android:

layout_width="fill_parent"

android:

layout_height="fill_parent"

android:

background="@drawable/back">

layout_width="fill_parent"

android:

layout_height="wrap_content"/>

layout_width="fill_parent"

android:

layout_height="wrap_content"

android:

id="@+id/path"/>

layout_width="fill_parent"

android:

layout_height="18dip"

style="?

android:

attr/progressBarStyleHorizontal"

android:

id="@+id/progressBar"/>

layout_width="fill_parent"

android:

layout_height="wrap_content"

android:

gravity="center"android:

id="@+id/result"/>

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="下载"

android:

id="@+id/button_download"/>

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="暂停"

android:

id="@+id/button_pause"/>

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="删除"

android:

id="@+id/button_delete"/>

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="返回首页"

android:

id="@+id/button_back"/>

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

id="@+id/button_alreadylist"

android:

text="已下载列表"/>

已下载列表界面:

播放页面:

具体代码代码为

xmlversion="1.0"encoding="utf-8"?

>

android="

android:

orientation="vertical"

android:

layout_width="fill_parent"

android:

layout_height="fill_parent"

android:

padding="10px">

android:

layout_width="fill_parent"

android:

layout_height="240dip"

android:

id="@+id/surfaceView"

/>

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

gravity="center"

>

android:

id="@+id/playTime"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="00:

00"

>

android:

id="@+id/progress_bar"

android:

layout_height="wrap_content"

android:

layout_width="200px"

android:

layout_toRightOf="@id/playTime"

style="?

android:

attr/progressBarStyleHorizontal"

/>

android:

id="@+id/totalTime"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

layout_toRightOf="@id/progress_bar"

android:

text="00:

00"

>

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

gravity="center"

>

id="@+id/button_up"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

layout_marginTop="5px"

style="?

android:

attr/buttonStyleSmall"

android:

src="@drawable/button_up"/>

id="@+id/button_play"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

layout_toRightOf="@id/button_up"

android:

layout_marginTop="5px"

style="?

android:

attr/buttonStyleSmall"

android:

src="@drawable/button_pause"/>

id="@+id/button_next"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

layout_toRightOf="@id/button_play"

android:

layout_marginTop="5px"

style="?

android:

attr/buttonStyleSmall"

android:

src="@drawable/button_next"/>

代码为:

1.3.3XML解析

Ø文件结构:

在本应用中从服务器端信息都是以XML形式获得,这里就在所难免的需要使用前面章节讲到的XML解析相关应用。

实体类

首先需要我们根据需求写出相应的实例类。

结合本例,需要解析的有两个实体。

1:

当用户发出请求需要获得内容列表时,解析视频信息需要的视频对象。

2:

当用户发出请求需要获得内容分类时,解析分类信息需要的分类对象。

com.sharpandroid_video.channel.entity

+Video.java

+Category.java

Handler类

使用SAX解析,在处理不同类型的XML时就需要不同的Handler类,这是SAX解析的特点。

com.sharpandroid_video.channel.entity.xml

+ChannelHandler.java

+VideoHandler.java

由于从服务器得到的XML的结构较为简单,在重写Handler时,没必要重写无关的事件,ChannelHandler.java代码如下:

packagecom.sharpandroid_video.channel.entity.xml;

importjava.util.ArrayList;

importorg.xml.sax.SAXException;

importorg.xml.sax.helpers.DefaultHandler;

importcom.sharpandroid_video.channel.entity.Category;

publicclassChannelHandlerextendsDefaultHandler{

privateStringcontent;

privateCategorycurrent=newCategory();

publicArrayListchannels=newArrayList();

@Override

publicvoidcharacters(char[]ch,intstart,intlength)

throwsSAXException{

Stringpart=newString(ch,start,length);

if(!

part.equals("\n"))

if(content!

=null)

content+=part;

else

content=part;

}

@Override

publicvoidendElement(Stringuri,StringlocalName,Stringname)

throwsSAXException{

if("categoryid".equalsIgnoreCase(localName)){

current.setCategoryid(content);

}elseif("regularIcon".equalsIgnoreCase(localName)){

current.setRegularIcon(content);

}elseif("AltIcon".equalsIgnoreCase(localName)){

current.setAltIcon(content);

}elseif("Thumbnail".equalsIgnoreCase(localName)){

……………….

channels.add(current);

current=newCategory();

}

content=null;

}

}

大家可以看到,本例里只是重写了characters(),endElement()两个事件,就完成了需求。

这是值得注意的,在开发过程中并不是所有的Handler事件都要重写的,结合你需要解析的XML特点,编写以最简洁的方式完成自己的应用,才是最佳方式。

VideoHandler.java的编写类似,故不再赘述。

方法实现:

com.sharpandroid_video.helper

+ParserXML.java

在实体类,Handler类编写完毕,就是整体的实现过程,下面给出获得“推荐内容”XML文件的过程。

其他方法类同。

publicstaticArrayList

try{

VideoHandlerhandler=newVideoHandler();

Stringhttp="http:

//192.168.1.188:

8080/SharpVideo/getSharpVideo.jsp";

InputStreaminput=newURL(http).openStream();

SAXParsersp=spf.newSAXParser();

XMLReaderreader=sp.getXMLReader();

reader.setContentHandler(handler);

InputSourceinputSource=newInputSource(input);

reader.parse(inputSource);

input.close();

returnhandler.videos;

}catch(Exceptione){

e.printStackTrace();

}

returnnull;

}

1.3.4视频文件下载

Ø下载模块概述

为了实现视频的播放,需要将文件从网络下载到本地,将文件存储在手机的SD卡中,之后再随时读取SD卡中的文件,实现文件的播放。

在下载中为了提高运行的效率和用户的体验,我们依然采取多线程、断点的方式,在之前的网络一章中已经重点介绍了如何实现多线程、断点下载,下面我们就来进一步完善它。

说明:

由于此模块是在以前多线程、断点功能上完善,很多代码都是重复的,而且数量是很多的。

此节只介绍了关键代码,有些删减的代码需要回顾网络一篇多线程、断点下载。

望理解。

实现流程:

在BrowserActivity界面中弹出buildDialog对话框--下载DownLoaderActivity界面--点击【下载】Button--断点、多线程下载

--点击【暂停(删除)】Button--下载暂停(删除)

--点击【返回首页】Button--回到首页界面

--点击【已下载列表】Button--转到已经文件界面

实现思路:

1.在实现断点、多线程的基础上传入一个唯一标识位实现下载的暂停和删除。

2.将已经下载的文件存入到SD卡的同时,新建一个数据库表,存入下载文件的相关信息。

3.点击【已下载列表】按钮通过Intent跳转到已下载目录,并显示已下载文件信息。

4.点击已下载文件的任意信息,跳转到播放的界面,实现本地播放。

5.点击【返回首页】按钮通过Intent跳转到首页。

Ø下载模块的下载

文件的下载将采用多线程、断点的方式,相关知识已经在网络一篇有很详细的介绍,这里就不再过多赘余,下面是实现下载的时序图:

如有不清楚请回顾网络一章,现在要在此基础上实现下载的暂停和删除操作。

Ø下载模块的暂停

首先需要了解下载过程中线程的相互关系:

1.主进程(主线程)开启了一个download线程。

2.download线程又开启了三条用于真正下载的线程。

它们在工作的过程中是独立的,并发的执行流,当要暂停下载操作时,需要同时听停止三条真正下载的线程,在线程中已经为我们提供了类似的方法,但是这里我们使用标记位的方式来实现。

当点击下载的同时给其绑定一个Map值,其key为每一个下载资源的path,values为每一个下载传入一个Boolean的值,true或者false。

当我们点击【下载】时会同时也把这个标记值传过去,在实现下载的DownloadThread类中进行判断,如果传入是true则下载。

反之点击【暂停】时,传入是false则暂停。

注意:

在暂停时不要单一的去暂停当前下载的线程,因为操作系统是采用的是效率更高的抢占式多任务策略,如果你停了其中的一个,还有两个可以抢占cpu资源继续下载,所以我们根据它的唯一标记url来判断,则可以同时将其停止。

编写DownLoaderActivity.java代码:

(完整)

packagecom.sharpandroid_video.download.download.activity;

publicclassDownLoaderActivityextendsActivity{

privatestaticfinalStringTAG="DownLoaderActivity";

privateEditTextpathEditT

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1