摘 要:本系統(tǒng)采用C/S模式,客戶端采用Android開發(fā)平臺(tái),服務(wù)器端采用Java開發(fā)環(huán)境,客戶端與服務(wù)器端之間的連接通過Socket通信,提供對(duì)圖像信息的基本操作,包括圖像添加、刪除、查找、上傳以及分類等,從而實(shí)現(xiàn)了一種基于Socket的手機(jī)圖像采集和傳輸系統(tǒng)。
關(guān)鍵詞:Android;Camera;C/S模式;Socket
1 引言
在2G時(shí)代,圖像的采集僅保存于手機(jī)內(nèi)存卡上,對(duì)內(nèi)存卡的要求比較高,并且圖像的傳輸受限于較小的傳輸介質(zhì)覆蓋范圍和帶寬,手機(jī)等移動(dòng)終端上圖像實(shí)時(shí)傳輸?shù)膽?yīng)用實(shí)例并不多,形式上也多為定期的圖片傳輸。隨著網(wǎng)絡(luò)的高速發(fā)展,在Android系統(tǒng)中圖像流的采集和傳輸越來越快速、便捷,大多都利用傳輸媒介保存到遠(yuǎn)程服務(wù)中,比較常見的傳輸媒介有3G、EDGE及WiFi等。
本文設(shè)計(jì)和開發(fā)了一種將大量圖片保存在遠(yuǎn)程服務(wù)器的手機(jī)圖像采集和傳輸系統(tǒng),不僅減輕了手機(jī)客戶端的存儲(chǔ)壓力,同時(shí)還可進(jìn)行圖片的遠(yuǎn)程備份和編輯,使整個(gè)圖片保存更有條理,管理更方便。
2 系統(tǒng)功能概述
本系統(tǒng)實(shí)現(xiàn)了在手機(jī)端對(duì)實(shí)時(shí)景象進(jìn)行采集,并上傳到遠(yuǎn)程服務(wù)器,同時(shí)對(duì)上傳圖像提供分類、查找功能。系統(tǒng)采用C/S模式,客戶端和服務(wù)器端采用Socket進(jìn)行連接??蛻舳耸褂肁ndroid開發(fā)平臺(tái),負(fù)責(zé)進(jìn)行圖像的采集和保存、瀏覽,并選擇上傳到遠(yuǎn)程服務(wù)器端。服務(wù)器端采用Java開發(fā),負(fù)責(zé)將上傳的圖片保存到數(shù)據(jù)庫中,實(shí)現(xiàn)圖片編號(hào)、添加、查找、編輯和分類功能。
3 系統(tǒng)關(guān)鍵技術(shù)
3.1 Socket連接
Socket用于描述IP地址和端口,在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話。套接字之間的連接過程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)[2][3],如圖1所示。
3.2 Camera類
通過實(shí)現(xiàn)android.hardware.Camera.PictureCallback接口,在onPictureTaken重載函數(shù)中,獲取當(dāng)前拍攝的圖像數(shù)據(jù),實(shí)現(xiàn)拍照保存的流程如下[4]:
4 系統(tǒng)的主要實(shí)現(xiàn)
4.1 客戶端
圖像采集功能主要通過重載onPictureTaken函數(shù),將拍下的圖像數(shù)據(jù)發(fā)送到一個(gè)指向文件的輸出流中,將圖像保存到文件中:
public void onPictureTaken(byte[] arg0,Camera arg1) {
bitmap.compress(Bitmap.CompressFormat.JPEG,80, bOutputStream);
bOutputStream.flush();
bOutputStream.close();}
客戶端在連接服務(wù)器上傳圖片時(shí),本機(jī)的端口不需要指定,系統(tǒng)會(huì)自動(dòng)選取一個(gè)當(dāng)前不用的端口與服務(wù)端固定端口連接:
Socket s = new Socket(SERVER_ADDR,SERVER_PORT);
OutputStream out = s.getOutputStream();
InputStream in = new FileInputStream(a);
while((i in.read())!=-1) {out.write(i); }
4.2 服務(wù)器端
⑴服務(wù)器端開啟socket連接服務(wù),等待客戶端的連接,準(zhǔn)備接收?qǐng)D片:
⑵得到發(fā)送方的輸入流:
ServerSocket server = new ServerSocket(SERVER_PORT);
Socket s = server.accept();
InputStream in = s.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
⑶構(gòu)造保存文件的文件輸出流:
OutputStream out = new FileOutputStream(\"d:/\"+file_name+\".jpeg\");
⑷從輸入流按字節(jié)循環(huán)讀取字節(jié),發(fā)給輸出流,直到輸入流結(jié)束:
while((i=in.read())!=-1){out.write(i);}
5 結(jié)束語
本文分析了Android操作系統(tǒng)中圖像采集、顯示與傳輸相關(guān)的各種關(guān)鍵技術(shù),基于Android平臺(tái),結(jié)合網(wǎng)絡(luò)圖像傳輸技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)手機(jī)圖像采集和傳輸系統(tǒng),該系統(tǒng)可運(yùn)行于3G無線通信網(wǎng)絡(luò)和WLAN無線網(wǎng)絡(luò),具有終端功能完善、可擴(kuò)展性強(qiáng)等特點(diǎn),達(dá)到了最初的設(shè)計(jì)目的。
[參考文獻(xiàn)]
[1]王向輝,張國印,陳潔.Android應(yīng)用程序開發(fā)[M].北京:清華大學(xué)出版社,2010.
[2]Douglas E.Comer, David L.Ste.用TCP/IP進(jìn)行網(wǎng)際互連—客戶-服務(wù)器編程與應(yīng)用[M].北京:電子工業(yè)出版社,2009.
[3]劉淼.嵌入式系統(tǒng)接口設(shè)計(jì)與Linux驅(qū)動(dòng)程序開發(fā)[M].北京:北京航空航天大學(xué)出版社,2006.
[4]朱國斌,基于Android系統(tǒng)的Camera模塊設(shè)計(jì)和實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2011.