李寧寧,鄭純軍
(大連東軟信息學院計算機科學與技術系,遼寧 大連 116023)
責任編輯:許 盈
隨著Android手機和網絡的迅速發展和普及,二者相結合的應用與日俱增。而移動終端受自身資源有限的約束,無法滿足終端應用高存儲的需求[1],因此手機往往會影響圖片的大量存儲工作。為了解決這一矛盾,本文設計了基于Android的網絡相冊系統。該系統的客戶端為Android手機,用戶可以進行拍照、瀏覽圖片,然后將選中的圖片上傳至微博或網絡服務器上,從而借助網絡服務器的空間分擔客戶端的存儲壓力,節省了手機空間。
本文介紹了在Android上進行網絡相冊系統的開發與設計,使用Android平臺推出的SDK和Eclipse開發環境實現了本地相冊的圖片瀏覽、編輯、上傳,網絡相冊的管理、換膚和網絡設置等,并可以在模擬器以及真機上運行。
Google公司推出的Android智能手機平臺系統,以其開源、開放和優異便捷的開發架構,吸引了眾多程序開發者[2]。本文以網絡相冊系統中涉及到的技術為主線,著重介紹相關的知識點并闡述該技術在本系統中的應用。根據用戶的需求和軟件的特點,本系統的功能設計與體系結構如圖1所示。

圖1 網絡相冊體系結構
本文的界面主要是利用GridView和ListView組件進行設計的。二者的編程過程比較類似,所以本部分僅以ListView為例進行簡單介紹。ListView是Android編程中最重要的組件之一,因為其數據來源靈活并可以實現自身的樣式定制。ListView中的列表數據是通過適配器將其映射到組件中。列表的適配器類型有ArrayAdapter、SimpleAdapter和SimpleCursorAdapter三種,也可以通過繼承BaseAdapter類自己定義適配器。在自定義的適配器類中,編程人員通過實現getView 方法為其第二個參數convertView進行賦值,實現自己定義的顯示效果。本相冊中,需要在列表中包含刪除按鈕,所以選擇自定義適配器方式:首先定義一XML布局文件,設計出ListView中的item樣式;自定義適配器類,并定義內部holder類,用來盛放ListView中每一項的內容;最后將getView中的convert-View賦值成設定的內容。
Intent為 Activity,Service和 BroadcastReceiver等組件提供交互能力[3]。在本系統中,有多個自定義的Activity組件,并多次調用系統功能界面(例如網絡設置、拍照),通過廣播組件實現了換膚功能等,為此,系統中通過Intent連接不同的組件。系統功能界面的調用是通過Intent的隱式啟動,匹配系統功能界面的action實現調用。例如拍照功能的啟動,只需要如下代碼:

AndroidManifest.xml清單文件是每個Android項目都必需的,它是整個Android應用的全局描述文件[4]。系統中定義的Activity組件和BroadcastReceiver組件都需要在AndroidManifest.xml中進行注冊,并通過action和categry指定主啟動界面。另外,由于Android系統運行在Linux內核上,有嚴格的安全及權限機制。本模塊要使用到網絡連接和SD卡的訪問,這都需要具有相應的權限,需要在AndroidManifest.xml中通過為 < manifest…/> 元素添加<uses-permission…/>子元素即可為自身聲明權限,否則無法正常運行,且編譯過程中,程序不會報錯,只能通過捕獲異常來發現這一問題。Android中提供了大量的權限,這些權限都位于Manifest.permission類中。
在本系統中,本地相冊需要訪問存儲在外部設備(SD卡)中的所有圖片。圖片信息存儲在android.provider.MediaStore.Images.Thumbnails 數據庫中,通過 Cursor可以讀取圖庫里的所有圖片的相關信息,包括圖片的名稱、類型、大小、時間、路徑等。本系統主要使用對該數據庫的信息查詢功能,調用ContentProvider組件的query函數實現。
而對于網絡服務器部分的圖片存儲,是根據當前用戶名命名文件夾,然后將所有圖片放置其中。每個用戶只能管理自己文件夾下的圖片。
本系統采用的客戶端/服務器的架構??蛻舳?即手機端)負責拍照、本地圖片管理等功能——集成了手機上的圖庫和相機軟件的功能,并增加了換膚、美化等模塊;服務器端負責接收上傳圖片、管理網絡圖片等。為完成網絡相冊各模塊的功能,客戶端建立了Android SDK+Java JDK+E-clipse的開發環境,基于Android 2.2版本開發;服務器端采用MyEclipse+Tomcat+MySQL的組合進行開發。
客戶端采用Android系統,它基于Linux平臺,自底向上由4個層次組成:Linux內核層、Android運行時庫和其他庫層、應用框架層、應用程序層。本文的網絡相冊系統是應用程序層的開發。Android應用程序開發是基于框架和組件的。
為了在主界面中包含本地相冊、網絡相冊和其他3個部分的功能,本系統采用的是TabActivity和TabHost組織完成。TabHost是一個裝載Tab的容器,每個Tab項可以加載一個布局,可以通過TabActivity的getTab-Host()方法獲得TabHost對象,TabHost中提供了添加及修改Tab頁的方法。
2.1.1 本地相冊
本地相冊首頁采用GridView來完成。GridView組件是網格視圖,其中的每一個條目通過適配器和該組件進行關聯。本系統自定義了適配器類型,其中包含一個ImageView和一個TextView組件,分別用來顯示文件夾下的圖片和圖片名稱、個數。進入到選中的文件夾下后,選擇待瀏覽圖片,則以Gallery組件顯示其中的圖片內容。Gallery是圖片瀏覽組件,主要實現橫向顯示圖片列表。為此,需要創建一個適配器,負責獲取圖片資源,并通過重寫getView方法,實現設置圖片顯示效果。
對于選中的圖片,可以進行分享、上傳至網絡相冊,編輯,刪除,重命名,圖片美化等操作。“分享”功能是將圖片上傳到已注冊的微博賬號中進行發布,主要是借助Intent的createChooser函數選擇相關的微博客戶端進行上傳;“上傳至網絡相冊”是將圖片上傳到本系統搭建的網絡服務器中;“編輯”功能是借助于Android中自帶的裁剪功能完成的,即調用“com.android.camera.action.CROP”的Intent,通過傳遞相應的參數來實現;“刪除”和“重命名”功能主要是通過調用文件的delete和rename-To函數完成;“圖片美化”是通過設置畫筆的顏色、粗細、特效等對圖片進行繪制,在onOptionsItemSelected函數中判斷單擊的是哪個菜單,并作出響應操作。
2.1.2 網絡相冊
網絡相冊部分,根據用戶名,管理各自部分的圖片,包括下載圖片、刪除圖片等功能。首先,用戶需要注冊,然后登錄到自己的相冊中,其中以ListView組件列出了該用戶文件夾下的所有圖片。該ListView的每一項中包含了ImageView,TextView和ImageButton三個控件,分別用來顯示圖片、圖片名稱和刪除按鈕。View的find-ViewById方法比較耗時,為了提高效率,因此需要考慮只調用一次,借助于ViewHolder將以上三個控件進行封裝,同時充分利用!=null的判斷。
2.1.3 其他
其他功能主要包括拍照、換膚和網絡設置。拍照調用的是Android系統中的相機功能;換膚是采用最簡單的原理:將所有的背景圖片以GalleryFlow的形式進行顯示,確定好背景圖片后,利用BroadcastReceiver組件更新所有的背景圖片;網絡設置是調用Android系統中自帶的網絡設置功能。
網絡服務器端的搭建,是用 MyEclipse工具集成Tomcat服務器開發,并采用MySQL數據庫存儲用戶及其圖片信息。服務器端主要實現與手機客戶端的圖片傳輸功能:將客戶端上傳的圖片存儲到服務器的用戶名文件夾下;根據手機當前登錄用戶,提供對應的圖片供其瀏覽和下載。根據MVC的編程思想,本系統雖然沒有用戶界面層,依然將業務邏輯層和控制層分開——業務邏輯層實現圖片的刪除、下載等功能;控制層由Servlet編程實現。
手機客戶端在Eclipse開發環境下,使用Java語言,設計和實現了基于Android平臺的網絡相冊程序,并在真機和模擬器上分別進行了測試,得到了預期的效果。采用的平臺版本不能低于Android 2.2。網絡服務器端提供了圖片的存儲空間和信息管理,并保證能和客戶端進行通信和圖片傳輸。
圖2所示為網絡相冊在真機上運行時的主界面,即本地相冊的圖片縮略圖,列出了所有含有圖片的文件夾,并顯示出圖片個數。圖3所示為網絡相冊在模擬器上運行時的網絡相冊部分列表界面,即從網絡服務器上獲取用戶文件夾下所有的圖片,并以自定義的ListView樣式進行顯示。圖4所示是換膚功能中,選擇背景圖片的界面效果。



基于Android平臺的網絡相冊應用程序,如果需要大量的圖片瀏覽,往往會因為內存溢出而使程序崩潰。因此該系統對此進行了優化處理,GridView和ListView中的圖片均經過了壓縮處理,顯示的是壓縮效果圖。圖片不是通過文件的輸入輸出流進行讀取的,而是通過ContentProvider的Cursor進行遍歷的。
網絡圖片的下載,會由于網速、圖片大小的限制,影響程序的運行速度。因此,對于圖片的下載進行了異步處理,每次下載時創建一個新的線程,在run函數中完成圖片下載的過程。
本文開發實現了基于Android平臺的網絡相冊應用程序,完成了包括客戶端和服務器端功能框架的設計開發和系統部署,可以為手機用戶提供本地、網絡相冊存儲和管理功能,即在保證了系統自帶的圖庫功能的基礎上,主要增加了網絡存儲功能,并整合了拍照、美化、換膚等功能。驗證了該應用程序的實用性和可行性,也為廣大的Android開發者提供了參考。
[1]王培海.基于Android的移動云存儲系統設計與實現[J].電視技術,2011,35(15):94-97.
[2]楊豐盛.Android應用開發揭秘[M].北京:機械工業出版社,2010.
[3]王向輝,張國印,沈潔.Android應用程序開發[M].北京:清華大學出版社,2010.
[4]李剛.瘋狂Android講義[M].北京:電子工業出版社,2011.
[5]黃藝峰,閆巧.基于Android平臺電子詞典的設計與實現[J].計算機應用,2011,31(S2):228-232.