彭 飛
(安徽信息工程學院 計算機與軟件工程學院,安徽 蕪湖 241000)
目前,市場上關于移動學習的安卓程序較多,除了可以播放學習視頻之外,絕大部分應用程序是將學習內容以網頁化的形式在客戶端進行展示,但目前高校教師團隊的課件基本都是PPT/DOC/PDF格式,在經過轉換之后,很難保證在客戶端瀏覽的格式與電腦端保持一致,那么自然會降低學習效果和效率.因此,若能設計并研發出一款在安卓客戶端直接對PPT/DOC/PDF格式的課件進行在線閱讀的移動學習應用程序,其對促進教育的發展,所帶來的社會效益都將是非常可觀的[1].
安卓是一個以Linux系統內核為基礎,開放源代碼,具有高度可擴展性的智能手機操作系統,是目前市場上使用率較高的手機操作系統之一[2].
正是由于安卓系統是開放式的,在不支付任何費用的情況都可直接使用,因此在目前國內,手機生產廠商基于企業利潤或研發成本的考慮,都會選擇安卓系統作為其生產的手機操作系統[20].
PDF課件閱讀客戶端之所以選擇安卓系統作為平臺的重要原因就是由于安卓具有以下優勢:
因為安卓的開放性,智能移動終端的生產廠商很大一部分都已經成為安卓聯盟中的一員,導致其擁有大量的開發者,系統用戶和應用程序也日益增多,最終也就促使了安卓系統以極快的速度走向成熟.
安卓操作系統目前支持所有的網絡制式,包括CDMA、EV-DO、TD-SCDMA、GSM/EDGE、UMTS、Bluetooth、Wi-Fi、LTE、NFC和WiMAX.因此用戶可以不受網絡運營商的限制而連接入網絡,能夠更簡單地進行網絡數據的使用.
由于安卓的開發性,大量的設備制造廠商的加入,因而就會推出屏幕尺寸各異、各具功能特色、性能差異巨大,但又不缺失人性化的產品[3].
目前企業中的安卓程序的研發人員大多數都在基于Eclipse平臺進行代碼編寫和調試工作.Eclipse平臺是一個開源的軟件項目,由于它是一套軟件框架和服務,所以就能夠通過添加不同的插件來達到開發不同應用程序的目的.目前這個平臺有眾多版本,其中就包括谷歌公司專門針對開發安卓應用程序所開發的一一個版本,被稱之為ADT-Bundle.ADT-Bundle本質上就是以Eclipse平臺為基礎,添加了ADT插件以及最新版本的安卓的SDK.研發人員就可以利用該平臺直接新建安卓工程,編寫調試代碼,打包并發布安卓應用程序,創建安卓模擬器,在模擬器上安裝并測試安卓應用程序,這樣對于安卓應用程序的研發就可以更加集中精力,提高開發效率.
本移動客戶端的的系統拓撲結構如圖1所示.

圖1 系統拓撲圖
HttpClient作為一個開源的、易于網絡請求的HTTP客戶端,由于其既可以發送請求,又可以接收響應,因此目前安卓項目已經集成了HttpClient用于請求發送和響應接受.安卓應用程序的開發人員能夠直接利用HttpClient進行網絡操作,來達到與Web服務器進行數據交互的目的.
在安卓程序中利用HttpClient進行網絡操作,包括發送請求和接收響應,大致包括以下幾個操作:
實例化HttpClient表示客戶端.
實例化請求對象,根據請求方式分為兩種情況:假如是GET,則實例化HttpGet類;假如是POST,則實例化HttpPost類.
執行客戶端實例的execute方法用于進行請求,該方法的返回值為服務器響應對象,通過調用該對象的方法則可以獲取服務器響應的各項數據.
根據響應對象的屬性判斷是否正常.
如果響應正常,則獲得響應對象當中的數據.
不同于市場上大部分移動學習客戶端都是以文本或網頁直接在界面中呈現,為保證在本客戶端中對課件的瀏覽內容和格式與在電腦端中保持一致,課件閱讀模塊是基于開源項目MuPDF案例的基礎上,從服務器端獲取課件文檔數據后,然后直接瀏覽PDF格式的文件,同時具有翻頁,放大縮小文檔的功能.
課件閱讀的時序圖如圖2所示.

圖2 課件閱讀時序圖
本客戶端以Eclipse作為開發環境,使用Java進行研發,采用SQLite進行客戶端數據的存儲[4].下載由谷歌公司推出的專門開發安卓應用程序的集成軟件包:ADT Bundle.
本客戶端通過調用符合REST格式的WebService接口來完成與學習資源平臺業務數據的交互,此時就需要一個公共的網絡訪問組件,那么我們把公共訪問組件封裝到HttpUtil類中,這個類是利用安卓系統SDK原生態的網絡組件HttpClient搭建,可以通過網絡地址以Get或者Post的方式向服務器請求并傳遞數據,然后獲取服務器響應的數據.利用HttpClient進行網絡訪問有下面幾步:
(1)實例化HttpClient對象,代碼如下:
HttpClient httpClient=new DefaultHttpClient();
(2)根據請求方式,實例化httpGET或httpPost對象,這些對象的創建都要傳入即將訪問的網絡地址,代碼如下:
HttpPost post=new HttpPost(url);
(3)如果有數據需要傳遞給服務器,則將數據進行封裝處理,代碼如下:

(6)解析得到的響應數據內容.
(7)關閉http連接,釋放對象資源,代碼如下:
httpClient.getConnectionManager().shutdown();
MuPDF是目前在安卓設備上進行PDF瀏覽領域,集成應用最多的開源項目之一,其具有小而快速的特點.而且功能齊全,支持對PDF文件進行批注、搜索等一系列功能.
本客戶端在實現課件閱讀功能時,集成了基于MuPDF的開源項目,并對界面做了實用性修改,刪除部分自帶的冗余功能.具體實現如下:
(a)下載基于MuPDF的開源項目artifex.mupdf
(b)在本客戶端項目src目錄下創建包名com.artifex.mupdf,然后將開源項目中代碼拷貝到該包下.注意:此處新建的包名不可做任何變動.
(c)將開源項目中的libmupdf.so文件復制到安卓工程中的指定的文件夾內,如圖3所示:

圖3 libmupdf.so文件位置
(d)在項目中的清單文件AndroidManifest.xml中,進行Activity的聲明注冊,代碼如下:


(e)在客戶端中進行課件閱讀時,將非加密狀態下的課件文檔路徑存入到Intent對象中,然后跳轉到步驟4聲明的MuPDFActivity,即可顯示該課件進行閱讀.代碼如下:

課件閱讀是基于開源項目MuPDF的項目案例,其具有小而快速瀏覽pdf文件的特性.由于MuPDF項目只能支持文件瀏覽,而不支持二進制數據,所以當從學習資源平臺獲取加密的文檔數據之后,首先會在客戶端本地生成臨時文件,然后將臨時文件的路徑通過Intent對象傳遞給項目中瀏覽界面,進行文檔的閱讀.由于臨時文件是不加密的,就存放于本地,為了課件的安全性,需要在瀏覽界面中重寫onDestroy函數及時刪除臨時文件.
(a)將PDF文件瀏覽界面的Activity在清單文件AndroidManifest.xml進行注冊.
(b)從服務端獲取要瀏覽的課件數據,并在客戶端本地通過IO讀寫生成文件,注意此時文件處于加密狀態.
(c)將文件路徑存入到Intent對象,并通過該對象跳轉到文件瀏覽界面MuPDFActivity,代碼如下:

(d)在MuPDFActivity類中的onCreate方法內,通過Intent對象完成文件路徑的數據傳值,利用DES解密算法對文件進行解密操作,生成可直接瀏覽的文件,同時根據文件路徑刪除加密文件.
(e)進行的課件的瀏覽,實現大小變化、上頁下頁等.
(f)在MuPDFActivity類中的onDestroy方法內,負責及時刪除可直接瀏覽、不加密的課件,代碼如下:

Android客戶端實現了一個學習者可以利用服務器端中現有的課件等資源,在業余、閑散、碎片化的時間能夠進行學習,及時地解決了當前大部分學習客戶端軟件不能直接瀏覽課件(PPT/DOC/PDF)的弊端.為保證服務器端中的現有課件在本客戶端閱讀時與電腦端的內容格式的一致,集成并應用開源項目MuPDF實現對PDF文件的在線瀏覽.