APP下载

基于Android平台的视频客户端的设计与实现

2015-09-11徐奔

电脑知识与技术 2015年17期

徐奔

摘要:该文系统地研究了Android平台架构,设计开发了基于Android系统的手机视频客户端。通过对该客户端各个功能模块及数据库的设计,实现了视频客户端登录页面、首页面、视频详情页、视频播放页、频道页面、用户页面、断点续传下载器等功能模块的开发,系统运行效果良好,使视频资源在手机端、PC端等平台上完成了无缝对接。同时也为其他Android应用开发提供了一定的参考价值。

关键词: Android;视频播放器;断点续传

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)17-0075-02

随着信息技术的飞速发展,从手机等移动终端设备获取所需信息变得越来越便捷,面对庞大的用户群,移动端程序开发也越来越成为主流,形成了一个新兴的盈利点。优酷、土豆及爱奇艺等在线影视媒体平台都相继自主研发了手机视频客户端。拥有丰富视频资源的视频媒体平台可以成为热门,其相应的视频客户端就有一定的竞争能力。再者,如果该视频客户端界面友好、设计人性化、播放功能全面,其前景将非常乐观。开发基于Android平台的手机视频客户端,不仅能给开发者带来收入,对于视频媒体平台本身,也能为客户带来更加丰富而有创新的应用,吸引更多的用户,从而提升企业的经济和社会效益。

1 相关开发技术

1.1 Android框架

Android是极度开源的开发工具,将源代码封装成独立框架,供其他开发者使用。

1) Afinal框架:封装了Android中的Http框架,包含4个模块:FinalDB模块、FinalHttp模块、FinalBitmap模块和FinalActivity模块。其中使用FinalHttp模块可实现视频下载功能。

2) AvosCloud框架:支持服务器环境部署、运维,数据库扩容、升级和备份。可用于存储用户登录、注册和下载列表等数据。

3) Picasso框架:是Square公司开源的Android图形缓存库,可以实现图片下载和缓存功能。能使用最少内存完成复杂的图形转换操作,如变换大小,旋转等。还可用于实现视频图片显示。

1.2 MediaPlayer

MediaPlayer是一个可用于控制音频与视频文件的类。Android对播放音视频文件和流的控制是通过一个状态机来管理的。当该类的对象被实例化或是调用reset()方法后,会处于Idle状态。调用了release()方法后,会处于End状态。存在这两种状态之间的就是MediaPlayer对象的生命周期。

1.3 SharePreferences

Android中SharedPreferences类是用于保存常用字段的存储类。它提供了Android平台常用的Int型、String型、Long型的保存方法,主要用于用户信息的存储。当用户通过登录认证后,将用户相关的信息以String形式保存在XML文件中,方便开发者随时调用。

1.4 Activity Thread

ActivityThread是用来管理应用进程的主线程的执行,并负责调度和执行activities、broadcasts和其它操作。在Android系统中,一个应用程序内各个组件都会在相同进程的主线程中执行。主线程需要处理Activity组件的UI事件与Service后台服务工作,其可创建多个子线程来处理后台服务的工作,而本身专心处理UI事件被称为UI线程。Thread的使用可以方便开发者完成视频列表数据更新、视频播放、视频下载等重要功能。

2 视频客户端分析与设计

2.1 视频客户端系统功能

1) 用户登录注册:用户注册和登录,记录用户使用客户端的频率。

2) 视频分类显示:不同客户对视频的需求不同,将视频分门别类,方便查找所需资源。

3) 视频信息展示:显示视频的详细信息,包括显示视频介绍图片。

4) 视频播放:实现对用户选择的视频进行流畅播放,界面操作简便。

5) 离线下载:使用断点续传方式下载视频,在网络稳定的条件下,直接下载或断点续传,并保存在手机中;在无网络连接的条件下,播放已下载视频。下载完成后添加到已完成下载目录中。

6) 下载列表进度显示:方便用户随时查看视频下载进度,下载成功时自动更新列表。

2.2 视频客户端系统模块

视频客户端系统各模块功能如图1所示:

图1 视频客户端系统模块功能

2.3 数据库设计

数据库分两块:接口数据库和用户数据库。接口数据库解析方式为JSON解析;用户数据库是在LeanCloud后端开发平台实现。LeanCloud中有封装好的User类,只需调用login方法和register方法,将数据与后台交互,调用的方法都是异步的,在线程中实现。

通过浏览器访问首页视频信息,可获取到首页信息的JSON接口,通过JSON转换,可以获取到相应的接口信息。其他接口还有分页获取指定栏目视频页面接口、视频详情接口、视频播放接口、视频下载接口等。

3 视频客户端的实现

3.1 TabHost的实现

采用TabHost底部框架设计,Eclipse自带Support-v4的library包在TabHost类中,使用时继承TabActivity类,初始化各个点击菜单,填充其需要跳转的页面,实现对底部Tab菜单的切换功能。

在XML布局文件中,需对TabHost进行布局设计。将所有菜单按钮设计成RadioButton,放在RadioGroup中以便管理点击事件。点击事件发生后显示的界面大小,设定为除去顶部和底部后其余的中间位置。用FrameLayout布局页面显示。

3.2 首页的实现

视频客户端首页主体内容是视频分类,同时包含当前页面引导字段、下载界面进入按钮和异步获取图片轮播组件等,使用最外层ListView组件将分类添加到Adapter中,每个分类都有图片和视频名,使用GridView组件,将图片添加到适配器中。

实现过程的难点与解决方法:

1)图片轮播组件的侧滑栏手势动作与ListView下滑上移等动作有冲突。解决方法一:将ListView滑动监听取消,让ListView和图片轮播组件嵌套在ScrollView中,使用ScrollView垂直滑动替代ListView的滑动机制。解决方法二:将图片轮播组件添加到适配器中,作为数据第一项,且ListView不使用ViewHolder机制,而是直接判断当前position的位置加载ListView,最后在数据传入Adapter前添加一条空的记录,用来扩充被图片轮播组件占据的位置。

2)ListView与GridView相结合产生点击事件焦点混淆问题。解决方法一:将点击事件放置在Adapter中,使用ViewHolder机制,对所需的点击按钮进行点击事件监听。解决方法二:除了所需点击按钮控件,其他控件一律取消其点击事件。

3)显示图片过多导致手机内存溢出事件。解决方法:利用Picasso开源框架实现异步获取图片并缓存在内存中,并可任意更改下载图片源大小,减少内存损耗。

3.3 视频详情页的实现

视频详情页提供视频的详细情况介绍,如导演、主演、区域、类型、年份及评分等。包含二个按钮:简介按钮(显示视频简介)、选集按钮(显示可供选看的集数)。

实现过程的难点与解决方法:

由于视频信息都是以JSON接口形式存放在数据库中,故获取JSON数据并提取出来是实现过程的一个难点。解决方法:使用开源框架Afinal-5把接口信息以String形式获取下来,存储在各种对象中。因获取页面信息是异步的,故应在数据获取成功后再调用方法填充数据。否则,若提前将数据传到适配器中,适配器无法获取,导致ListView内数据为空。

3.4 视频播放页的实现

该模块是视频客户端开发的重点,由于视频资源获取多基于网络,播放器需与服务器连接。播放器使用Android自带播放类MediaPlayer开发。涉及的方法有:MediaPlayer.isPlaying()判断视频播放状态;MediaPlayer.pause()停止播放;MediaPlayer.start()开始播放;MediaPlayer.stop()暂停播放;MediaPlayer.release()释放内存;MediaPlayer.seekTo()快进到某位置,以百分形式显示;MediaPlayer.setOnCompletiononListener()视频播放结束后调用;MediaPlayer.getDuration()获取播放时长;MediaPlayer.reset()重置播放器;MediaPlayer.setDataSource(path)播放所给地址的视频。

实现过程的难点与解决方法:

1)MediaPlayer中不能以时间递增的方式获取播放进度。解决方法:开启线程休眠时间为1秒钟,每秒回调一次,时间增加1秒,若暂停播放视频,则暂停线程,若停止播放视频,则释放线程。该方法也可用于实现进度条更新的问题。

2)因MediaPlayer暂用资源多,主线程上运行大量线程,易导致主线程超载。且MediaPlayer在主线程上连接超过5秒会出现是否关闭界面的提示,用户使用感不佳。解决方法:开启子线程运行视频播放类线程和Timer线程(用来定期更新进度条和播放进度时间)。

3.5 频道页面的实现

频道页面中包含各个子频道,每个子频道都有两种选项:一种是全部视频,另一种是推荐视频,所有视频都可供用户自主选择。并且每个子频道中都采用下拉刷新、上拉加载更多视频资源的实现方式,以有效减少内存损耗。当用户点击各个分类子频道时,将不同视频信息填充到适配器中并显示出来。

实现过程的难点与解决方法:下拉刷新、上拉加载更多的方法是实现的难点。解决方法:利用开源方法PullToRefreshView,它是一个继承Linearlayout的方法。当用户拖动页面时,判断用户的手势方向。往上拉至底端调用onFooterRefresh方法,在Activity中监听该方法的触发事件,当该方法触发时获取下一个页面的JSON数据,添加数据到适配器中,并设置最后一 个Position为当前Selection即可。同理,往下拉至顶端调用onTopRefresh方法,重新连接网络获取JSON数据,重新添加至适配器中。

3.6 用户界面的实现

用户登录成功后,使用SharedPreferences方法保存用户名,生成XML文件保存用户相关信息,未退出前无需再次登录。并保存视频播放的历史记录。

3.7 断点续传下载器的实现

断点续传下载器是使用Afinal-5开源框架实现的。创建一个下载器对象,用于存储视频下载地址、视频名、视频大小等数据。同时创建一个单例模式,用于存储一个List,而List的类型是下载器对象。当用户开启下载,将数据获取成功后保存为对象上传到后台,设置到单例中。当用户下载相同视频,提醒用户该视频已加入下载缓存中,不需再下载。

下载页面分已完成和正在下载两部分。已完成的视频是通过下载器下载完成后上传到后台,再从后台提取数据后显示出来。正在下载的视频是通过下载器将下载信息添加到下载频道的数据中。

实现下载页面进度条前进效果,需要在下载器中每秒调用更新当前下载信息,不断将当前下载情况和下载位置以Int形式传递给下载对象,并且调用setProgress方法重新设置当前进度。

当用户下载结束后,下载器会删除该条下载记录,在下载完成界面显示。

4 结束语

本文主要研究的是基于Android的架构开发的手机视频客户端系统,此客户端实现了用户注册登录、视频分类显示、视频信息展示、视频播放、离线下载、下载进度显示等功能,给用户带来了很多方便,使视频资源在手机端、PC端等平台上完成了无缝对接,同时也为其他Android应用开发提供了一定的参考价值。

参考文献:

[1]杨明极,毕晶.基于Android视频客户端的设计[J].电视技术,2012,3(1):43-47.

[2]丁丽萍.Android操作系统的安全性分析[J].信息网络全,2012,3:28-31.

[3]毕晶.基于Android的视频客户端的设计[D].哈尔滨:哈尔滨理工大学,2012.

[4]李晓凤.Android下视频解码组件的研究与设计[D].杭州:浙江工业大学,2012.

[5]单俊丽.基于Android的流媒体客户端的研究与设计[D].西安:西安电子科技大学,2013.

[6]张玉清,王凯,杨欢,等.Android安全综述[J].计算机研究与发展,2014,7(1):1385-1396.