孙力群
摘要:在工(商)业环境下,对象的图文数据的实时采集、实时传递和处理是非常有价值之需求,但在传统基于PC的信息应用中,定制实现起来还是成本较高。移动互联网时代,利用普通的Android手机,完成这一任务对企业却几乎不需要增加硬件成本,通过整合移动设备的拍照,图片数据存储和提取功能,使用apache httpclient和MultipartEntityBuilder组合模式传送图片等业务数据至服务端,实现了以通用移动设备和软件技术应用达到较理想商业价值的目的。
关键词:Android;图片上传;移动应用;实时监控;httpclient;MultipartEntityBuilder
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)21-0064-02
在一些商业应用场景,经常会需要将待处理产品对象的图片和相关信息实时采集和发送到相关干系人,以便更精准和及时响应特、急事件的处理。在传统的客户机/服务器网络应用模式下,可能需要经过系统外的数据采集和准备,不能自然得纳入应用系统中,或者使用非通用化的定制设备。随着智能手机等大众化移动设备应用领域不断扩展,我们也可以充分利用之实现服务于工、商业环境下的移动应用。
1 应用需求特点
我们开发的生产执行系统,要求在项目监控功能里,监控者跟踪在制品对象的进度状况,监控者手机登录生产执行系统,对现场发现有问题的在制品,通过选择对应含责任人定位数据列表细目,启用信息发送界面,监控者可使用手机拍照后,随定制的文本信息一起,即时发送上传给应用服务器,也可调出已存在的图片文件发送。服务器接收后路由转发给相关责任人。这个需求有较强的类型意义,因为在传统的工业现场信息化应用,最多由车间内工作站充当数据采集、上报的终端,离现场发生情况的时、点都有一定距离,而通过将普通的智能手机等设备有机得纳入应用环境中,可以以性价比很高的方式即时采集,零距离反馈。
2 拍照与选择图片的整合设计
设计附加图片功能时,如果用户选用拍照方式,则调用手机拍照功能,拍摄后的照片会回传照片的Url路径,从中可以解析出照片文件的保存路径。如果用户选择已有照片,则调用手机的图片文件的选择功能,选择后也能回Url路径。这样两种方式就方便整合设计。
if (radioGroupMessageImageSource
.getCheckedRadioButtonId() == R.id.radio_capture_image_to_send_mes) {
//intent设定为系统内置的拍照功能
Intent intentForCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
ContentValuesmyContentValues = new ContentValues();
//在外存上准备新增一个图片文件,返回的是Uri格式的准备指向新文件的路径
uriPicture = ProjectMessageSendActivity.this .getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,myContentValues);
intentForCapture.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uriPicture);
//告诉系统,拍照后保存的文件Uri路径赋值给uriPicture
startActivityForResult(intentForCapture,ACTION_IMAGE_CAPTRUE);
} else {
Intent intentForSelect = new Intent();
//调用系统只选择图片对象的内容选择功能
intentForSelect.setAction(Intent.ACTION_GET_CONTENT);
intentForSelect.setType("image/*");
startActivityForResult(intentForSelect, ACTION_IMAGE_PICK);}
拍照或选择图片界面操作完成返回后,在接收处均可得到Uri格式的图片文件的引用路径,需要从中解析出File类型的目录,以便进一步处理。获取的图片按比例显示在预览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构建传输图文信息
包含图片文件和普通文本域的内容上传,使用传统的http文件上传编码方式,需要处理较多细节,因此选用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分类封装,繁杂的参数定义,文件上传的流处理都隐藏起来。服务端可按正常的接收含文件上专表单数据来处理。 4 结束语 通过上述功能的综合实现,现场人员只需在个人手机上安装app,随时将目标对象的数据和图片发送给相关责任人,服务端也作了后续归档处理。将现场采集、传递和响应融入到传统的生产执行系统应用中,既做到实时处理,又完成数据流后台归整,提升了整个系统的应用价值,得到用户的好评。 参考文献: [1] 高洪岩.android学精要[M].北京:清华大学出版社, 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]. 北京: 清华大学出版社, 2014. [6 ]陈文,郭依正.深入理解Android网络编程[M]. 北京: 机械工业出版社, 2013.