【Android论文栏目提醒】:网学会员Android论文为您提供毕业设计论文-客户端视频播放器(含代码) - 毕业设计参考,解决您在毕业设计论文-客户端视频播放器(含代码) - 毕业设计学习中工作中的难题,参考学习。
1 网络视频播放器1.1 项目概述 基于
Android 客户端的网络视频播放器,实现了网络服务器端视频文件分类列表显 示,下载并存储在手机 SD 卡中,随时进行播放。
1.2 项目目的 掌握 Andorid 页面 UI 设计 掌握 SAX 解析 XML 文件 掌握基于
android 平台多线程、断点下载 掌握视频多媒体播放1.3 项目实现流程 1.3.1 服务器端 服务器说明及搭建方法:第一, 将光盘中 xxx 下的工程导入 Eclipse 中,步骤如下。
点击【File】【Import】,之后 选择 下的 , 【Next】 通过 【General】 【Existing Projects into Workspace】 点击 , 【Browse】 定位到该工程的位置。
之后点击【Finish】 。
导入完成。
第二, 将该项目发布到 Tomcat 服务器上。
选择 右击该项目名, 【Run As】 【Run on Server】, 如下图: 之后点击【Finish】,此时,在浏览器中访问“http://localhost:8080/SharpVideo/”地址,可以得到如下界面。
说明服务器已经成功运行。
其中,之前六个以“.jsp”结尾的超链接分别对应服务器端程序中的六个 Jsp 文件,每个 Jsp 文件可以返回一个 XML 格式的结果,供手机客户端程序解析。
而后面的“picture/”和“video/”两个超链接对应服务器端程序中的两个文件夹,分别存放图片和视频。
getSharpCategory.jsp:返回该服务器端所有视频栏目的信息以及该栏目对应的标示图片及访问该类型的所有视频的列表地址。
返回结果格式如下:ltsharpCategorysgt lttotalgt4lt/totalgt ltsharpCategorygt ltcategoryidgt1lt/categoryidgt ltcaptiongt经典lt/captiongtltregularIcongthttp://localhost:8080/SharpVideo/picture/icon/jingdian.pnglt/regularIcongtltshownogthttp://localhost:8080/SharpVideo/getSharpVideoByCategroyid1.jsplt/shownogt ltcategorytypegt1lt/categorytypegt ltparentidgt0lt/parentidgt lt/sharpCategorygt…… ……lt/sharpCategorysgtgetSharpVideo.jsp:返回所有视频信息。
返回结果格式如下:ltsharpVideosgt lttotalgt20lt/totalgt ltsharpVideogt ltvideoidgt315lt/videoidgt ltdescriptiongt万山红_红歌_山丹丹开花红艳艳_镜头版lt/descriptiongt ltuploaddategt2010-05-03 16:13:03.0lt/uploaddategt lttitlegt万山红_红歌_山丹丹开花红艳艳_镜头版lt/titlegt ltownergtsharpandroidlt/ownergtltpictureUrlgthttp://localhost:8080/SharpVideo/picture/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_jingtouban.jpglt/pictureUrlgt ltlengthgt10lt/lengthgt ltsizegt10lt/sizegt ltkeywordsgt万山红_红歌_山丹丹开花红艳艳_镜头版lt/keywordsgt ltprocessedgt10lt/processedgtltandroiddownloadurlgthttp://localhost:8080/SharpVideo/video/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_jingtouban.mp3lt/androiddownloadurlgtltandroidplayurlgthttp://localhost:8080/SharpVideo/video/1jingdian/wanshanhong_hongge_shandandankaihuahongyanyan_jingtouban.mp3lt/androidplayurlgt lt/sharpVideogt…………lt/sharpVideosgt至于后面四个“.jsp”文件返回的分别是不同栏目的视频信息,格式与 getSharpVideo.jsp 的结果一致。
1.3.2 UI 页面设计 主页面 具体代码 补充完整具体代码为:频道页面具体代码补充完整 对话框页面 图片和具体代码补充完整 下载页面显示:具体代码代码为: ltxml versionquot1.0quot encodingquotutf-8quot gtltLinearLayoutxmlns:androidquothttp://schemas.
android.com/apk/res/androidquot
android:orientationquotverticalquot
android:layout_widthquotfill_parentquot
android:layout_heightquotfill_parentquot
android:backgroundquotdrawable/backquotgt ltTextView
android:layout_widthquotfill_parentquot
android:layout_heightquotwrap_contentquot /gt ltEditText
android:layout_widthquotfill_parentquot
android:layout_heightquotwrap_contentquot
android:idquotid/pathquot /gt ltProgressBar
android:layout_widthquotfill_parentquot
android:layout_heightquot18dipquot stylequotandroid:attr/progressBarStyleHorizontalquot
android:idquotid/progressBarquot /gt ltTextView
android:layout_widthquotfill_parentquot
android:layout_heightquotwrap_contentquot
android:gravityquotcenterquot
android:idquotid/resultquot /gt ltButton
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:textquot下载quot
android:idquotid/button_downloadquot /gt ltButton
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:textquot暂停quot
android:idquotid/button_pausequot /gt ltButton
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:textquot删除quot
android:idquotid/button_deletequot /gt ltButton
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:textquot返回首页quot
android:idquotid/button_backquot /gt ltButton
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:idquotid/button_alreadylistquot
android:textquot已下载列表quot /gt lt/LinearLayoutgt 已下载列表界面: 播放页面: 具体代码代码为ltxml versionquot1.0quot encodingquotutf-8quotgtltLinearLayout xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot
android:orientationquotverticalquot
android:layout_widthquotfill_parentquot
android:layout_heightquotfill_parentquot
android:paddingquot10pxquotgt ltSurfaceView
android:layout_widthquotfill_parentquot
android:layout_heightquot240dipquot
android:idquotid/surfaceViewquot /gt ltRelativeLayout
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:gravityquotcenterquot gt ltTextView
android:idquotid/playTimequot
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:textquot00:00quot gt lt/TextViewgt ltSeekBar
android:idquotid/progress_barquot
android:layout_heightquotwrap_contentquot
android:layout_widthquot200pxquot
android:layout_toRightOfquotid/playTimequot stylequotandroid:attr/progressBarStyleHorizontalquot /gt ltTextView
android:idquotid/totalTimequot
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:layout_toRightOfquotid/progress_barquot
android:textquot00:00quot gtlt/TextViewgtlt/RelativeLayoutgt ltRelativeLayout
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:gravityquotcenterquot gt ltImageButton
android:idquotid/button_upquot
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:layout_marginTopquot5pxquot stylequotandroid:attr/buttonStyleSmallquot
android:srcquotdrawable/button_upquot/gt ltImageButton
android:idquotid/button_playquot
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:layout_toRightOfquotid/button_upquot
android:layout_marginTopquot5pxquot stylequotandroid:attr/buttonStyleSmallquot
android:srcquotdrawable/button_pausequot/gt ltImageButton
android:idquotid/button_nextquot
android:layout_widthquotwrap_contentquot
android:layout_heightquotwrap_contentquot
android:layout_toRightOfquotid/button_playquot
android:layout_marginTopquot5pxquot stylequotandroid:attr/buttonStyleSmallquot
android:srcquotdrawable/button_nextquot/gtlt/RelativeLayoutgt lt/LinearLayoutgt代码为: 1.3.3 XML 解析 文件结构:在本应用中从服务器端信息都是以 XML 形式获得,这里就在所难免的需要使用前面章节讲到的 XML 解析相关应用。
实体类首先需要我们根据需求写出相应的实例类。
结合本例,需要解析的有两个实体。
1:当用户发出请求需要获得内容列表时,解析视频信息需要的视频对象。
2:当用户发出请求需要获得内容分类时,解析分类信息需要的分类对象。
com.sharpandroid_video.channel.entityVideo.javaCategory.javaHandler 类使用 SAX 解析,在处理不同类型的 XML 时就需要不同的 Handler 类,这是 SAX 解析的特点。
com.sharpandroid_video.channel.entity.xmlChannelHandler.javaVideoHandler.java由于从服务器得到的 XML 的结构较为简单,在重写 Handler 时,没必要重写无关的事件,ChannelHandler.java 代码如下:package com.sharpandroid_video.channel.entity.xmlimport java.util.ArrayListimport org.xml.sax.SAXExceptionimport org.xml.sax.helpers.DefaultHandlerimport com.sharpandroid_video.channel.entity.Categorypublic class ChannelHandler extends DefaultHandler private String content private Category currentnew Category public ArrayListltCategorygt channelsnew ArrayListltCategorygt Override public void characterschar ch int start int length throws SAXException String partnew Stringchstartlength ifpart.equalsquotnquot ifcontentnull contentpart else contentpart Override public void endElementString uri String localName String name throws SAXException ifquotcategoryidquot.equalsIgnoreCaselocalName current.setCategoryidcontent else ifquotregularIconquot.equalsIgnoreCaselocalName current.setRegularIconcontent else ifquotAltIconquot.equalsIgnoreCaselocalName current.setAltIconcontent else ifquotThumbnailquot.equalsIgnoreCaselocalName ………………. channels.addcurrent currentnew Category contentnull 大家可以看到,本例里只是重写了 charactersendElement两个事件,就完成了需求。
这是值得注意的,在开发过程中并不是所有的 Handler 事件都要重写的, 结合你需要解析的 XML特点,编写以最简洁的方式完成自己的应用, 才是最佳方式。
VideoHandler.java 的编写类似,故不再赘述。
方法实现:com.sharpandroid_video.helperParserXML.java在实体类,Handler 类编写完毕,就是整体的实现过程,下面给出获得“推荐内容”XML 文件的过程。
其他方法类同。
public static ArrayListltVideogt TopVideoList try VideoHandler handlernew VideoHandler String http quothttp://192.168.1.188:8080/SharpVideo/getSharpVideo.jspquot InputStream inputnew URLhttp.openStream SAXParser sp spf.newSAXParser XMLReader reader sp.getXMLReader reader.setContentHandlerhandler InputSource inputSourcenew InputSourceinput reader.parseinputSource input.close return handler.videos catch Exception e e.printStackTrace return null 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 代码: (完整)package com.sharpandroid_video.download.download.activitypublic class DownLoaderActivity extends Activity private static final String TAG quotDownLoaderActivityquot private EditText pathEditText 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 MapltString Booleangt flags new HashMapltStringBooleangt // 首先定义静态的标志位: public static int isDowning 0 //0 未下载, 1正在下载 2 暂停 3 下载完成 private Handler handler new Handler Override public void handleMessageMessage msg if Thread.currentThread.isInterrupted switch msg.what case 1: int size msg.getData.getIntquotsizequot String fileloadpath msg.getData.getStringquotstringbuilderquot progressBar.setProgresssize int result int floatprogressBar.getProgress / float progressBar .getMax 100 resultView.setTextresult quotquot if progressBar.getMax progressBar.getProgress setTitlequot下载成功quot showToastStringquot下载成功quot isDowning 3 fileService newFileServiceDownLoaderActivity.this InternetFile internetFile new InternetFileinternetFile.setNameFileDownloader.filename internetFile.setSavepathfileloadpath try fileService.saveinternetFile catch Exception e e.printStackTrace break case -1: String error msg.getData.getStringquoterrorquot showToastStringerror break super.handleMessagemsg 说明 String fileloadpath msg.getData.getStringquotstringbuilderquot 在主页面中得打下载的路径, fileService new FileServiceDownLoaderActivity.this 得到fileService对象,调用下载文件的业务方法。
InternetFile internetFile new InternetFile 下载文件的实体 internetFile.setNameFileDownloader.filename 得到下载文件的名字,并给实体赋值 internetFile.setSavepathfileloadpath 得到下载文件的目录,并给实体赋值 fileService.saveinternetFile 调用数据库的save保存方法,将文件实体保存到数据库中。
Override public void onCreateBundle savedInstanceState super.onCreatesavedInstanceState setContentViewR.layout.downloader Intent intent this.getIntent final String path intent.getExtras.getStringquoturlquot.trim pathEditText EditText this.findViewByIdR.id.path pathEditText.setTextpath progressBar ProgressBarfindViewByIdR.id.progressBar resultView TextView findViewByIdR.id.result / 下载操作 / button_down.