孫力群
摘要:在工(商)業(yè)環(huán)境下,對象的圖文數(shù)據(jù)的實(shí)時采集、實(shí)時傳遞和處理是非常有價值之需求,但在傳統(tǒng)基于PC的信息應(yīng)用中,定制實(shí)現(xiàn)起來還是成本較高。移動互聯(lián)網(wǎng)時代,利用普通的Android手機(jī),完成這一任務(wù)對企業(yè)卻幾乎不需要增加硬件成本,通過整合移動設(shè)備的拍照,圖片數(shù)據(jù)存儲和提取功能,使用apache httpclient和MultipartEntityBuilder組合模式傳送圖片等業(yè)務(wù)數(shù)據(jù)至服務(wù)端,實(shí)現(xiàn)了以通用移動設(shè)備和軟件技術(shù)應(yīng)用達(dá)到較理想商業(yè)價值的目的。
關(guān)鍵詞:Android;圖片上傳;移動應(yīng)用;實(shí)時監(jiān)控;httpclient;MultipartEntityBuilder
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)21-0064-02
在一些商業(yè)應(yīng)用場景,經(jīng)常會需要將待處理產(chǎn)品對象的圖片和相關(guān)信息實(shí)時采集和發(fā)送到相關(guān)干系人,以便更精準(zhǔn)和及時響應(yīng)特、急事件的處理。在傳統(tǒng)的客戶機(jī)/服務(wù)器網(wǎng)絡(luò)應(yīng)用模式下,可能需要經(jīng)過系統(tǒng)外的數(shù)據(jù)采集和準(zhǔn)備,不能自然得納入應(yīng)用系統(tǒng)中,或者使用非通用化的定制設(shè)備。隨著智能手機(jī)等大眾化移動設(shè)備應(yīng)用領(lǐng)域不斷擴(kuò)展,我們也可以充分利用之實(shí)現(xiàn)服務(wù)于工、商業(yè)環(huán)境下的移動應(yīng)用。
1 應(yīng)用需求特點(diǎn)
我們開發(fā)的生產(chǎn)執(zhí)行系統(tǒng),要求在項目監(jiān)控功能里,監(jiān)控者跟蹤在制品對象的進(jìn)度狀況,監(jiān)控者手機(jī)登錄生產(chǎn)執(zhí)行系統(tǒng),對現(xiàn)場發(fā)現(xiàn)有問題的在制品,通過選擇對應(yīng)含責(zé)任人定位數(shù)據(jù)列表細(xì)目,啟用信息發(fā)送界面,監(jiān)控者可使用手機(jī)拍照后,隨定制的文本信息一起,即時發(fā)送上傳給應(yīng)用服務(wù)器,也可調(diào)出已存在的圖片文件發(fā)送。服務(wù)器接收后路由轉(zhuǎn)發(fā)給相關(guān)責(zé)任人。這個需求有較強(qiáng)的類型意義,因?yàn)樵趥鹘y(tǒng)的工業(yè)現(xiàn)場信息化應(yīng)用,最多由車間內(nèi)工作站充當(dāng)數(shù)據(jù)采集、上報的終端,離現(xiàn)場發(fā)生情況的時、點(diǎn)都有一定距離,而通過將普通的智能手機(jī)等設(shè)備有機(jī)得納入應(yīng)用環(huán)境中,可以以性價比很高的方式即時采集,零距離反饋。
2 拍照與選擇圖片的整合設(shè)計
設(shè)計附加圖片功能時,如果用戶選用拍照方式,則調(diào)用手機(jī)拍照功能,拍攝后的照片會回傳照片的Url路徑,從中可以解析出照片文件的保存路徑。如果用戶選擇已有照片,則調(diào)用手機(jī)的圖片文件的選擇功能,選擇后也能回Url路徑。這樣兩種方式就方便整合設(shè)計。
if (radioGroupMessageImageSource
.getCheckedRadioButtonId() == R.id.radio_capture_image_to_send_mes) {
//intent設(shè)定為系統(tǒng)內(nèi)置的拍照功能
Intent intentForCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
ContentValuesmyContentValues = new ContentValues();
//在外存上準(zhǔn)備新增一個圖片文件,返回的是Uri格式的準(zhǔn)備指向新文件的路徑
uriPicture = ProjectMessageSendActivity.this .getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,myContentValues);
intentForCapture.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uriPicture);
//告訴系統(tǒng),拍照后保存的文件Uri路徑賦值給uriPicture
startActivityForResult(intentForCapture,ACTION_IMAGE_CAPTRUE);
} else {
Intent intentForSelect = new Intent();
//調(diào)用系統(tǒng)只選擇圖片對象的內(nèi)容選擇功能
intentForSelect.setAction(Intent.ACTION_GET_CONTENT);
intentForSelect.setType("image/*");
startActivityForResult(intentForSelect, ACTION_IMAGE_PICK);}
拍照或選擇圖片界面操作完成返回后,在接收處均可得到Uri格式的圖片文件的引用路徑,需要從中解析出File類型的目錄,以便進(jìn)一步處理。獲取的圖片按比例顯示在預(yù)覽imageView中。
String[] pictures = { MediaStore.Images.Media.DATA };
Cursor imageCR = managedQuery(uriPicture, pictures, null, null,null);
imageCR.moveToFirst();
intimage_index = imageCR
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String imagePath = imageCR.getString(image_index);
File imageFile = new File(imagePath);
FileInputStream stream = new FileInputStream(imageFile);
//讀取生成圖片
Bitmap image =MediaStore.Images.Media.getBitmap(
this.getContentResolver(), uriPicture);
//防止圖片過大溢出,按比例縮放顯示
BitmapFactory.OptionsBFOption = new BitmapFactory.Options();
BFOption.inSampleSize = Math.max((int) (4096 / image.getWidth()),
(int) (4096 / image.getHeight())) + 1;
BitmapmyMap = BitmapFactory.decodeStream(pictureInput, null,BFOption);
// myMap = Bitmap.createScaledBitmap(bitmap ,2048,2048, false);
imageViewSendMessageImage.setImageBitmap(myMap);
3 使用MultipartEntityBuilder構(gòu)建傳輸圖文信息
包含圖片文件和普通文本域的內(nèi)容上傳,使用傳統(tǒng)的http文件上傳編碼方式,需要處理較多細(xì)節(jié),因此選用apache httpclient和MultipartEntityBuilder組合模式,非常簡潔得包裝完成
MultipartEntityBuildermultipartEntity = MultipartEntityBuilder
.create();
inti = 0;
while (i if (keyValueList.get(i).getName()//圖片文件上傳 .equals("projectMessageImage")) { File file = new File(keyValueList .get(i).getValue()); multipartEntity.addBinaryBody(keyValueList.get(i) .getName(),file,ContentType.create("image/jpeg"), file.getName()); } else {//表單字段處理 multipartEntity.addPart(keyValueList.get(i).getName(), newStringBody(keyValueList.get(i).getValue(), ContentType.create("text/plain","UTF-8"))); } } 通過MultipartEntityBuilder分類封裝,繁雜的參數(shù)定義,文件上傳的流處理都隱藏起來。服務(wù)端可按正常的接收含文件上專表單數(shù)據(jù)來處理。 4 結(jié)束語 通過上述功能的綜合實(shí)現(xiàn),現(xiàn)場人員只需在個人手機(jī)上安裝app,隨時將目標(biāo)對象的數(shù)據(jù)和圖片發(fā)送給相關(guān)責(zé)任人,服務(wù)端也作了后續(xù)歸檔處理。將現(xiàn)場采集、傳遞和響應(yīng)融入到傳統(tǒng)的生產(chǎn)執(zhí)行系統(tǒng)應(yīng)用中,既做到實(shí)時處理,又完成數(shù)據(jù)流后臺歸整,提升了整個系統(tǒng)的應(yīng)用價值,得到用戶的好評。 參考文獻(xiàn): [1] 高洪巖.android學(xué)精要[M].北京:清華大學(xué)出版社, 2012. [2] Ronan Schwarz.The AndroidDevelopers Cookbook[M]. Indiana:Addsion-wesley, 2014. [3] Wallace Jackson.Pro Android UI[M].NewYork:Appress, 2013. [4] OnurClinar.Pro Android Quick ApisReferencee[M].NewYork:Appress, 2013. [5] Reto Meier. Android 4 高級編程[M]. 北京: 清華大學(xué)出版社, 2014. [6 ]陳文,郭依正.深入理解Android網(wǎng)絡(luò)編程[M]. 北京: 機(jī)械工業(yè)出版社, 2013.