徐奔
摘要:該文系統(tǒng)地研究了Android平臺架構(gòu),設(shè)計開發(fā)了基于Android系統(tǒng)的手機視頻客戶端。通過對該客戶端各個功能模塊及數(shù)據(jù)庫的設(shè)計,實現(xiàn)了視頻客戶端登錄頁面、首頁面、視頻詳情頁、視頻播放頁、頻道頁面、用戶頁面、斷點續(xù)傳下載器等功能模塊的開發(fā),系統(tǒng)運行效果良好,使視頻資源在手機端、PC端等平臺上完成了無縫對接。同時也為其他Android應(yīng)用開發(fā)提供了一定的參考價值。
關(guān)鍵詞: Android;視頻播放器;斷點續(xù)傳
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2015)17-0075-02
隨著信息技術(shù)的飛速發(fā)展,從手機等移動終端設(shè)備獲取所需信息變得越來越便捷,面對龐大的用戶群,移動端程序開發(fā)也越來越成為主流,形成了一個新興的盈利點。優(yōu)酷、土豆及愛奇藝等在線影視媒體平臺都相繼自主研發(fā)了手機視頻客戶端。擁有豐富視頻資源的視頻媒體平臺可以成為熱門,其相應(yīng)的視頻客戶端就有一定的競爭能力。再者,如果該視頻客戶端界面友好、設(shè)計人性化、播放功能全面,其前景將非常樂觀。開發(fā)基于Android平臺的手機視頻客戶端,不僅能給開發(fā)者帶來收入,對于視頻媒體平臺本身,也能為客戶帶來更加豐富而有創(chuàng)新的應(yīng)用,吸引更多的用戶,從而提升企業(yè)的經(jīng)濟和社會效益。
1 相關(guān)開發(fā)技術(shù)
1.1 Android框架
Android是極度開源的開發(fā)工具,將源代碼封裝成獨立框架,供其他開發(fā)者使用。
1) Afinal框架:封裝了Android中的Http框架,包含4個模塊:FinalDB模塊、FinalHttp模塊、FinalBitmap模塊和FinalActivity模塊。其中使用FinalHttp模塊可實現(xiàn)視頻下載功能。
2) AvosCloud框架:支持服務(wù)器環(huán)境部署、運維,數(shù)據(jù)庫擴容、升級和備份。可用于存儲用戶登錄、注冊和下載列表等數(shù)據(jù)。
3) Picasso框架:是Square公司開源的Android圖形緩存庫,可以實現(xiàn)圖片下載和緩存功能。能使用最少內(nèi)存完成復(fù)雜的圖形轉(zhuǎn)換操作,如變換大小,旋轉(zhuǎn)等。還可用于實現(xiàn)視頻圖片顯示。
1.2 MediaPlayer
MediaPlayer是一個可用于控制音頻與視頻文件的類。Android對播放音視頻文件和流的控制是通過一個狀態(tài)機來管理的。當(dāng)該類的對象被實例化或是調(diào)用reset()方法后,會處于Idle狀態(tài)。調(diào)用了release()方法后,會處于End狀態(tài)。存在這兩種狀態(tài)之間的就是MediaPlayer對象的生命周期。
1.3 SharePreferences
Android中SharedPreferences類是用于保存常用字段的存儲類。它提供了Android平臺常用的Int型、String型、Long型的保存方法,主要用于用戶信息的存儲。當(dāng)用戶通過登錄認證后,將用戶相關(guān)的信息以String形式保存在XML文件中,方便開發(fā)者隨時調(diào)用。
1.4 Activity Thread
ActivityThread是用來管理應(yīng)用進程的主線程的執(zhí)行,并負責(zé)調(diào)度和執(zhí)行activities、broadcasts和其它操作。在Android系統(tǒng)中,一個應(yīng)用程序內(nèi)各個組件都會在相同進程的主線程中執(zhí)行。主線程需要處理Activity組件的UI事件與Service后臺服務(wù)工作,其可創(chuàng)建多個子線程來處理后臺服務(wù)的工作,而本身專心處理UI事件被稱為UI線程。Thread的使用可以方便開發(fā)者完成視頻列表數(shù)據(jù)更新、視頻播放、視頻下載等重要功能。
2 視頻客戶端分析與設(shè)計
2.1 視頻客戶端系統(tǒng)功能
1) 用戶登錄注冊:用戶注冊和登錄,記錄用戶使用客戶端的頻率。
2) 視頻分類顯示:不同客戶對視頻的需求不同,將視頻分門別類,方便查找所需資源。
3) 視頻信息展示:顯示視頻的詳細信息,包括顯示視頻介紹圖片。
4) 視頻播放:實現(xiàn)對用戶選擇的視頻進行流暢播放,界面操作簡便。
5) 離線下載:使用斷點續(xù)傳方式下載視頻,在網(wǎng)絡(luò)穩(wěn)定的條件下,直接下載或斷點續(xù)傳,并保存在手機中;在無網(wǎng)絡(luò)連接的條件下,播放已下載視頻。下載完成后添加到已完成下載目錄中。
6) 下載列表進度顯示:方便用戶隨時查看視頻下載進度,下載成功時自動更新列表。
2.2 視頻客戶端系統(tǒng)模塊
視頻客戶端系統(tǒng)各模塊功能如圖1所示:
圖1 視頻客戶端系統(tǒng)模塊功能
2.3 數(shù)據(jù)庫設(shè)計
數(shù)據(jù)庫分兩塊:接口數(shù)據(jù)庫和用戶數(shù)據(jù)庫。接口數(shù)據(jù)庫解析方式為JSON解析;用戶數(shù)據(jù)庫是在LeanCloud后端開發(fā)平臺實現(xiàn)。LeanCloud中有封裝好的User類,只需調(diào)用login方法和register方法,將數(shù)據(jù)與后臺交互,調(diào)用的方法都是異步的,在線程中實現(xiàn)。
通過瀏覽器訪問首頁視頻信息,可獲取到首頁信息的JSON接口,通過JSON轉(zhuǎn)換,可以獲取到相應(yīng)的接口信息。其他接口還有分頁獲取指定欄目視頻頁面接口、視頻詳情接口、視頻播放接口、視頻下載接口等。
3 視頻客戶端的實現(xiàn)
3.1 TabHost的實現(xiàn)
采用TabHost底部框架設(shè)計,Eclipse自帶Support-v4的library包在TabHost類中,使用時繼承TabActivity類,初始化各個點擊菜單,填充其需要跳轉(zhuǎn)的頁面,實現(xiàn)對底部Tab菜單的切換功能。
在XML布局文件中,需對TabHost進行布局設(shè)計。將所有菜單按鈕設(shè)計成RadioButton,放在RadioGroup中以便管理點擊事件。點擊事件發(fā)生后顯示的界面大小,設(shè)定為除去頂部和底部后其余的中間位置。用FrameLayout布局頁面顯示。
3.2 首頁的實現(xiàn)
視頻客戶端首頁主體內(nèi)容是視頻分類,同時包含當(dāng)前頁面引導(dǎo)字段、下載界面進入按鈕和異步獲取圖片輪播組件等,使用最外層ListView組件將分類添加到Adapter中,每個分類都有圖片和視頻名,使用GridView組件,將圖片添加到適配器中。
實現(xiàn)過程的難點與解決方法:
1)圖片輪播組件的側(cè)滑欄手勢動作與ListView下滑上移等動作有沖突。解決方法一:將ListView滑動監(jiān)聽取消,讓ListView和圖片輪播組件嵌套在ScrollView中,使用ScrollView垂直滑動替代ListView的滑動機制。解決方法二:將圖片輪播組件添加到適配器中,作為數(shù)據(jù)第一項,且ListView不使用ViewHolder機制,而是直接判斷當(dāng)前position的位置加載ListView,最后在數(shù)據(jù)傳入Adapter前添加一條空的記錄,用來擴充被圖片輪播組件占據(jù)的位置。
2)ListView與GridView相結(jié)合產(chǎn)生點擊事件焦點混淆問題。解決方法一:將點擊事件放置在Adapter中,使用ViewHolder機制,對所需的點擊按鈕進行點擊事件監(jiān)聽。解決方法二:除了所需點擊按鈕控件,其他控件一律取消其點擊事件。
3)顯示圖片過多導(dǎo)致手機內(nèi)存溢出事件。解決方法:利用Picasso開源框架實現(xiàn)異步獲取圖片并緩存在內(nèi)存中,并可任意更改下載圖片源大小,減少內(nèi)存損耗。
3.3 視頻詳情頁的實現(xiàn)
視頻詳情頁提供視頻的詳細情況介紹,如導(dǎo)演、主演、區(qū)域、類型、年份及評分等。包含二個按鈕:簡介按鈕(顯示視頻簡介)、選集按鈕(顯示可供選看的集數(shù))。
實現(xiàn)過程的難點與解決方法:
由于視頻信息都是以JSON接口形式存放在數(shù)據(jù)庫中,故獲取JSON數(shù)據(jù)并提取出來是實現(xiàn)過程的一個難點。解決方法:使用開源框架Afinal-5把接口信息以String形式獲取下來,存儲在各種對象中。因獲取頁面信息是異步的,故應(yīng)在數(shù)據(jù)獲取成功后再調(diào)用方法填充數(shù)據(jù)。否則,若提前將數(shù)據(jù)傳到適配器中,適配器無法獲取,導(dǎo)致ListView內(nèi)數(shù)據(jù)為空。
3.4 視頻播放頁的實現(xiàn)
該模塊是視頻客戶端開發(fā)的重點,由于視頻資源獲取多基于網(wǎng)絡(luò),播放器需與服務(wù)器連接。播放器使用Android自帶播放類MediaPlayer開發(fā)。涉及的方法有:MediaPlayer.isPlaying()判斷視頻播放狀態(tài);MediaPlayer.pause()停止播放;MediaPlayer.start()開始播放;MediaPlayer.stop()暫停播放;MediaPlayer.release()釋放內(nèi)存;MediaPlayer.seekTo()快進到某位置,以百分形式顯示;MediaPlayer.setOnCompletiononListener()視頻播放結(jié)束后調(diào)用;MediaPlayer.getDuration()獲取播放時長;MediaPlayer.reset()重置播放器;MediaPlayer.setDataSource(path)播放所給地址的視頻。
實現(xiàn)過程的難點與解決方法:
1)MediaPlayer中不能以時間遞增的方式獲取播放進度。解決方法:開啟線程休眠時間為1秒鐘,每秒回調(diào)一次,時間增加1秒,若暫停播放視頻,則暫停線程,若停止播放視頻,則釋放線程。該方法也可用于實現(xiàn)進度條更新的問題。
2)因MediaPlayer暫用資源多,主線程上運行大量線程,易導(dǎo)致主線程超載。且MediaPlayer在主線程上連接超過5秒會出現(xiàn)是否關(guān)閉界面的提示,用戶使用感不佳。解決方法:開啟子線程運行視頻播放類線程和Timer線程(用來定期更新進度條和播放進度時間)。
3.5 頻道頁面的實現(xiàn)
頻道頁面中包含各個子頻道,每個子頻道都有兩種選項:一種是全部視頻,另一種是推薦視頻,所有視頻都可供用戶自主選擇。并且每個子頻道中都采用下拉刷新、上拉加載更多視頻資源的實現(xiàn)方式,以有效減少內(nèi)存損耗。當(dāng)用戶點擊各個分類子頻道時,將不同視頻信息填充到適配器中并顯示出來。
實現(xiàn)過程的難點與解決方法:下拉刷新、上拉加載更多的方法是實現(xiàn)的難點。解決方法:利用開源方法PullToRefreshView,它是一個繼承Linearlayout的方法。當(dāng)用戶拖動頁面時,判斷用戶的手勢方向。往上拉至底端調(diào)用onFooterRefresh方法,在Activity中監(jiān)聽該方法的觸發(fā)事件,當(dāng)該方法觸發(fā)時獲取下一個頁面的JSON數(shù)據(jù),添加數(shù)據(jù)到適配器中,并設(shè)置最后一 個Position為當(dāng)前Selection即可。同理,往下拉至頂端調(diào)用onTopRefresh方法,重新連接網(wǎng)絡(luò)獲取JSON數(shù)據(jù),重新添加至適配器中。
3.6 用戶界面的實現(xiàn)
用戶登錄成功后,使用SharedPreferences方法保存用戶名,生成XML文件保存用戶相關(guān)信息,未退出前無需再次登錄。并保存視頻播放的歷史記錄。
3.7 斷點續(xù)傳下載器的實現(xiàn)
斷點續(xù)傳下載器是使用Afinal-5開源框架實現(xiàn)的。創(chuàng)建一個下載器對象,用于存儲視頻下載地址、視頻名、視頻大小等數(shù)據(jù)。同時創(chuàng)建一個單例模式,用于存儲一個List,而List的類型是下載器對象。當(dāng)用戶開啟下載,將數(shù)據(jù)獲取成功后保存為對象上傳到后臺,設(shè)置到單例中。當(dāng)用戶下載相同視頻,提醒用戶該視頻已加入下載緩存中,不需再下載。
下載頁面分已完成和正在下載兩部分。已完成的視頻是通過下載器下載完成后上傳到后臺,再從后臺提取數(shù)據(jù)后顯示出來。正在下載的視頻是通過下載器將下載信息添加到下載頻道的數(shù)據(jù)中。
實現(xiàn)下載頁面進度條前進效果,需要在下載器中每秒調(diào)用更新當(dāng)前下載信息,不斷將當(dāng)前下載情況和下載位置以Int形式傳遞給下載對象,并且調(diào)用setProgress方法重新設(shè)置當(dāng)前進度。
當(dāng)用戶下載結(jié)束后,下載器會刪除該條下載記錄,在下載完成界面顯示。
4 結(jié)束語
本文主要研究的是基于Android的架構(gòu)開發(fā)的手機視頻客戶端系統(tǒng),此客戶端實現(xiàn)了用戶注冊登錄、視頻分類顯示、視頻信息展示、視頻播放、離線下載、下載進度顯示等功能,給用戶帶來了很多方便,使視頻資源在手機端、PC端等平臺上完成了無縫對接,同時也為其他Android應(yīng)用開發(fā)提供了一定的參考價值。
參考文獻:
[1]楊明極,畢晶.基于Android視頻客戶端的設(shè)計[J].電視技術(shù),2012,3(1):43-47.
[2]丁麗萍.Android操作系統(tǒng)的安全性分析[J].信息網(wǎng)絡(luò)全,2012,3:28-31.
[3]畢晶.基于Android的視頻客戶端的設(shè)計[D].哈爾濱:哈爾濱理工大學(xué),2012.
[4]李曉鳳.Android下視頻解碼組件的研究與設(shè)計[D].杭州:浙江工業(yè)大學(xué),2012.
[5]單俊麗.基于Android的流媒體客戶端的研究與設(shè)計[D].西安:西安電子科技大學(xué),2013.
[6]張玉清,王凱,楊歡,等.Android安全綜述[J].計算機研究與發(fā)展,2014,7(1):1385-1396.