admin管理员组

文章数量:1530521

2024年7月18日发(作者:)

第1O期 陈志伟,李天福:基于Android平台的云相册系统设计与实现 ・71・ 

<servlet ̄ 

<servlet—name>Service</serv1et—name> 

<servlet—class ̄ 

com.server.AnywhereServer.servlet.Anywhere 

Servlet 

</servlet—class.> 

</servlet> 

 ̄servlet--mapping ̄ 

<serv1et—name>Service</servlet—name> 

<url—pattern ̄/service.do</url-pattern ̄ 

</servlet—mapping> 

1.3云相册数据存储 

云相册服务器在接受客户端请求后,最重要的处理就 

是保存数据,如将客户端发送的相片和文字进行持久化存 

储。 

Bigtable是最直观的GAE存储方法,被设计用于处 

理海量数据。它是一个稀疏的、分布式的、持久化存储的 

多维度排序映射,不支持完整的关系数据模型。相反, 

Bigtable为用户提供了简单的数据模型,利用这个模型, 

客户可以动态控制数据的分布和格式。尽管存在文件大 

小限制的缺点,即每个文件不超过1MB,但是仍然可以使 

用Bigtable来存储一些账户信息,例如注册账户、账号密 

码等。 

当需要存储大数据文件时,例如相片、多媒体文件,则 

需要使用Blobstore存储方式。这是另一个基于<键,值 

>的存储方法,它最大能够保存和显示2GB的文件。虽 

然Blobstore不存在数据大小方面的问题,但它在使用上 

还是存在不友好因素,即需要客户端发送两次请求:第一 

次用于获得文件数据存储的URL,第二次使用上一次获 

得的URL发送提交真正的数据。在这点上,不仅浪费了 

用户宝贵的网络资源,同时也消耗了更多的云服务器 

CPU资源。 

在云相册系统中,相片数据使用Blobstore方式来存 

储,其它用户数据均使用BigTable方式存储。 

2系统Android客户端实现 

云相册系统的客户端选用占领智能手机市场半壁江 

山的Android系统平台。客户端通过网络以及调用接口 

方式,实现与云服务端的数据交互,以及系统客户端具体 

业务逻辑。 

2.1 Android客户端与云服务器交互 

云计算体系中的SOA构建层将云计算服务封装成标 

准的web Service,使得云计算客户端可以使用浏览器简 

单便捷地访问并使用这些服务。Android可以像浏览器 

样,调用Web Service接口实现和云服务端进行数据传 

输,通过标准化的定义服务接口,使得构建在系统中的各 

种服务以统一和通用的方式进行交互,也可以直接发送 

http请求和业务数据。 

客户端调用web Service时,数据使用XML格式;而 

直接发送http请求,则可以选择使用JSON数据格式。 

XML和JSON在可读性上都同样出色。XML使用自定 

义标签,意义清楚,但数据冗余较多,提供了对大规模数据 

的逐步解析方案,这种方案比较适合于对大量数据的处 

理;JS0N则因为语法简单,所以可读性好,解析较少的数 

据时能起到良好的效果。显然,JSON是轻量级的,它易 

于使用,并且容易转换到Java对象。因此,当数据较少 

时,直接使用http方式发送请求效率更好。 

本系统编写了一些工具类,利用这些工具类,客户端 

将能够轻松实现用户登录、相片上传等具体业务,主要有: 

(1)Task.java。用于创建http请求,通过构造JSON 

数据格式的请求参数,设定网络请求方式,即可简单快捷 

地创建网络请求任务。 

(2)HttpHelp.java。用于实现3种方式发送http请 

求,有直接get方式、post方式以及携带文件或者图像数 

据的post方式。 

(3)Worker.java。在设定回调侦听者之后,实现数据 

后台异步加载并回调服务器返回的后续业务流程。 

2.2注册登录模块 

运行客户端之后,首先进入登陆界面。若未有登陆账 

号,可以点击“注册”按钮进行注册。注册成功后,云服务 

器将返回用户ID,用户使用此ID账号进行系统登录。 

客户端发送请求:构建登录所需要的JSON参数,分 

别为动作类别(Login)、账号以及密码。将JSON格式数 

据添加到Task的参数中,然后执行Worker,即可将登录 

请求发送到云服务器。服务器根据动作类别判定执行用 

户登录验证流程,并返回验证结果。 

同时,在worker中注册了一个侦听回调函数parse— 

Data(),解析云服务器返回结果,用于判断服务器是否通 

过本次登录。 

2.3拍照上传模块 

登录系统后,在主面板上点击“拍照上传”按钮,进入 

客户端拍照上传模块,主要实现手机客户端相片数据采集 

功能,然后使用手机网络服务,将数据上传到云服务端。 

Android拍照可以有两种方式,第一种是直接发送命 

令,调用系统拍照功能: 

Intent intent—new Intent(MediaStore.ACT10N

IMAGE

CAPTURE); 

startActivityForResult(intent,0); 

在拍照完成后,得到相片数据: 

Bundle extras—data.getExtras(): 

Bitmap b一(Bitmap)extras.get(”data”); 

采用这种方式,软件稳定,无需担心各种系统问题。 

但因为调用了系统相机界面,无法做到界面定制,所以用 

户体验可能会相对差一些。 

第二种则是通过继承SufaceView来编写自定义预览 

界面,使用Camera进行数据捕获。本系统采用此种方 

法,在采集页面布局文件中设定预览窗口。在onCreate 

・ 72・ 软件导刊 2O13年 

中取得SurfaceView为一个显示面板,并通过显示面板得 

到其SurfaceView控制器,定义MySurfaceCa1lback类,重 

载控制器的Callback,主要用于操作Camera API,通过控 

制Camera调用底层摄像头接口,完成预览图片,拍摄图 

片等功能。 

mSurfaceView一(SurfaceView)findViewById(R.id. 

mysurfaceview); 

mSHolder—mSurfaceView.getHolder(): 

mSHolder.addCallback(new MySurfaceCallback()); 

mSHolder.setType(SurfaceHolder.SURFACE

TYPE PUSH BUFFERS): 

在实际应用中,用户点击“预览”按钮时,系统将打开 

摄像头,进入预览模式;点击“停止”按钮可以停止预览;点 

击“摄像”按钮进行图像抓捕,若不满意图像,可以点击“放 

弃”按钮重新选取画面。当用户抓拍好相片时,点击“详 

细”按钮,系统弹出相关信息表单填写界面,用户可以自由 

输入。最后,点击“提交”按钮将数据发送云服务器存储, 

代码如下: 

private void submit() 

{ 

if(mTask.mDataExt一一null l 1 mTask.mUr1.1ength() 

<1) 

{ 

return: 

} 

try 

{ 

JSONObject param—new JSONObject(); 

param.put(”action”,”PhotoAdd”);//上传的动作类 

别 

param.put(‘ euid”,Login.mEuid); 

param.put(“title”,mTitle.getText().toString()); 

param.put(”addr”,mAddr.getText().toString()); 

param.put(”introduction”,mIntroduction.getText(). 

toString()); 

param.put(”detail”,mDetail.getText().toString()); 

//将采集的描述信息添加到json参数中 

mTask.mType—Task.TYPE

POST

FILE;//携带 

文件的POST方式 

mTask.mEncode—Task.ENCODING_UTF8; 

mTask.mParam—param: 

Worker.execute(this,mTask,new Worker.TaskLis— 

tener() 

//使用工具类Worker提交数据 

{ 

public void onComplete(byteE]result) 

{ 

mTask.mDataExt—result; 

parseData();//侦听回调函数,解析云服务器返 

回结果 

} 

}); 

} 

catch(Exception e) 

{ 

e.printStackTrace() 

finish(); 

} 

} 

2.4浏览相册模块 

用户上传相片后,可以浏览回看自己的相册数据。客 

户端发送浏览请求后,云服务器首先返回相册的列表数 

据。为了不影响UI线程以及获得更好的用户体验,在得 

到相册列表数据之后,图像才会在后台异步加载。未加载 

完成前,相片区域将显示默认的本地图片。下载完成后, 

系统才会通知UI更新相应的图片数据。 

定义函数SetImageUrl,根据传人的图像URL,首先 

判断本地缓存有没有图,有的话则显示缓存数据,否则通 

过新建线程下载图像,并加入到缓存以备下次使用。这样 

的缓存机制既加快了图像载人速度,也减少了网络流量的 

开支,更减轻了服务器端的负载压力。 

用户点击相册进入相片列表界面,如果当前浏览者是 

相册的拥有者,则可以点击复选框选择一条或多条记录进 

行批量删除操作。这些请求都是使用工具类来完成,只是 

创建的参数以及回调函数不同。查看相册参数,动作类别 

是PhotoList,另外还需要一个查询账户ID,云服务器依据 

这个ID构建GQL语句检索出数据列表。查看相册某一 

相片的详细信息,则无需再次发起请求,只需要在相册列 

表界面,将用户选中记录的参数传给详细界面即可。这样 

既可以减轻服务器的负载压力,还能减少用户等待网络数 

据传输的时间,提高了用户体验性。 

3 结语 

云相册是移动互联网上云计算的一种创新应用,它将 

传统桌面计算为核心的任务处理转变为以网络为核心的 

任务处理,实现了个人相片的“即拍即存即取”功能。同 

时,可考虑对系统功能进行扩展,结合SNS社交理论,利 

用手机定位服务,帮助用户发现并关注身边人,促进人与 

人的关系与信息交流。总之,云相册系统不仅实现了文件 

存储功能,更体现了云计算“个人化”的市场应用前景。 

参考文献: 

[1]李德毅.云计算技术发展报告[M].北京:科学出版社,2012. 

[2]冯建平,吴丽华.“云计算”技术和“云计算”服务模式——全球信息 

化发展的未来[J].信息系统工程,2009(11). 

[32黄婕,刘新桥.云计算环境下移动平台数据终端应用模式研究[J]. 

软件导刊,2013(5). 

(责任编辑:孙娟) 

本文标签: 数据用户系统