一个为Web2.0网站增加多模态输入Android应用设计与实现
2016-01-05王丽娟王妍
王丽娟++王妍
摘要:用户在传统的Web 2.0网站上主要通过手工方式输入和搜索各类信息。随着智能手机等移动设备的普及,以及智能手机所提供的传感器数量和种类的增加,以多模态方式输入和搜索信息成为可能。设计并实现一个移动应用程序,为传统的Web 2.0网站增加多模态输入功能。以豆瓣网(www.douban.com)和大众点评网(www.dianping.com)为例,程序应能够:通过手机扫描图书条形码,来搜索图书信息,并记录于用户的豆瓣账号内;通过“摇一摇”功能搜索正在播放的音乐,并记录于用户的豆瓣账号内;通过GPS定位功能搜索周边商户,并在用户的大众点评账号中进行签到。
关键词:Android;智能手机;应用软件;多模态
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)29-0072-03
在智能手机的时代,在网络全球化的今天,手机俨然成为个人的“超级计算机”,深入生活的方方面面,人们越来越离不开智能手机。其中Android系统的迅猛发展,一定程度上加快了智能手机的普及速度。移动设备的普及,以及智能手机所提供的传感器种类和数量的增加,使通过移动终端以多种方式输入、记录和搜索信息成为可能。
基于以上原因,本文提出的“为Web2.0网站增加多模态输入的Android应用的设计与实现”这一设想,是设计一个利用手机提供的多种传感器实现以多种方式输入、记录和搜索信息的Android应用。进入信息时代以来,越来越多的信息涌入人们的生活,方便快捷的搜索、获取和整理信息显得尤为重要,因此本设计在日常生活中将有着不错的实用性。
1 功能需求分析
本软件是一个Android应用程序,可以通过手机所具备的各种传感器记录和搜索用户一天的各种活动,使用户通过手机与Web 2.0网站的交互更为方便快捷。软件的基本功能需求如下:
记录文字图片功能,用户可以通过App记录文字、照片,保存文本信息和时间,编辑和管理文本信息,并且可以导出所记录的文字信息,以txt纯文本格式保存。图片可以通过相机获取,也可以添加本地图片。
扫描图书功能,用户可以通过手机的摄像头扫描书籍的条形码,App会返回豆瓣网(www.douban.com)API所查找到的书籍信息。如果拥有豆瓣账户则可以登录,并收藏此书籍。用户也可以输入自己的信息生成二维码供其他用户扫描,使信息分享更为快捷。
查找餐厅签到功能,在用户打开GPS的情况下,App会通过大众点评网(www.dianping.com)API返回当前位置最近的餐厅信息,用户签到后,App会保存相关信息到手机中。如果用户手机中已经安装大众点评的App,则可以浏览更加详细的信息
2 系统开发环境
本设计开发工具为Eclipse Java EE IDE for Web Developers,版本: Kepler Service Release 2。 SDK(软件开发工具包)版本为22.6.2。
3 系统设计
3.1系统整体设计
根据系统需求分析可知,软件共有三个功能模块:文字图片模块、扫描图书模块、餐厅签到模块。系统和用户交互时需要直观的图形化界面,所以本项目共需要7个用户界面类,分别是MainActivity(软件主界面)、BWActivity(文字图片模块主界面)、BWNewActivity(文字图片模块输入界面)、Book(扫描图书功能主界面)、Book_view(扫描图书结果显示界面)、Main_Location(餐厅签到功能主界面)、Findbusiness(餐厅签到信息显示界面)。
4功能实现
本文主要针对餐厅签到功能模块设计与实现进行详细说明。餐厅签到功能流程图见图1。
餐厅签到功能模块主要分为三个部分,调用GPS获取当前位置信息,根据位置参数通过大众点评API获取当前位置餐厅信息,建立签到数据库。主要文件见表1。
表1 餐厅签到功能主要文件说明
[文件名\&说明\&Main_location.java\&主界面activity\& Findbusiness.java\&API连接、签到activity\&Main_location.xml\&主界面布局文件\&Findbusiness.xml\&结果显示页面布局文件\&Db.xml\&数据库列表显示布局文件\&]
图1 餐厅签到功能流程图
Android为使用GPS功能支持专门提供了一个LocationManger类,所有GPS定位相关的服务、对象都将由该对象产生。程序并不能直接创建LocationManger的实例,而是通过调用Context的getSystemService()方法来获取。首先AndroidManifest.xml文件中配置GPS和网络使用权限,代码如下:
LocationManager类调用getSystemService(Context.LOCATION_SERVICE)获取系统GPS服务,新建Location类调用locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)获得最后更新的GPS信息,最后调用location.getLatitude(),location.getLongtitude()方法分别获得经纬度信息。
得到String类型的经度纬度参数后传到Findbusiness.java,Findbusiness.java这个Activity主要负责与大众点评API的连接及餐厅信息的搜索。使用大众点评API需要申请APIkey与密钥,目前只是测试用,所以返回的是测试数据。APIurl:http://api.dianping.com/v1/business/find_businesses 请求方法为HTTP GET,请求参数说明见表2。
表2 请求参数表
[参数\&必选/可选\&描述\&Format=json\&必选\&数据格式为json\&Latitude=x\&必选\&经度信息\&Longitude=y\&必选\&纬度信息\&Category=美食\&必选\&信息分类\&Limit=5\&必选\&返回数量\&Radius=2000\&必选\&搜索半径\&offset_type=0\&必选\&偏移类型未偏移\&Sort=7\&必选\&结果排序:离传入经纬度坐标距离近优先\&]
对APIkey、密钥与参数进行字符串连接,根据密钥和appkey生成签名访问链接,主要代码如下:
private URL codecParams(String codes) throws MalformedURLException, UnsupportedEncodingException {
String sign = DigestUtils.shaHex(codes).toUpperCase();
StringBuilder sb = new StringBuilder();
sb.append("appkey=").append(appkey).append("&sign=").append(sign);
for (java.util.Map.Entry
sb.append('&').append(entry.getKey()).append('=').append
(URLEncoder.encode(entry.getValue(), "utf-8"));// entry.getValue());
}
String requestUrl = apiUrl + "?" + sb.toString();
URLEncoder.encode(( sb.toString()), "UTF-8");
Log.d(TAG, "after sign the url is " + requestUrl);
return new URL(requestUrl);// requestUrl);
}
连接字符串生成链接后,使用HTTP GET方式请求数据,具体代码如下:
URL url = codecParams(codes);
System.out.println("the access network url is " + url.toString());
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(10000 /* milliseconds */);
urlConnection.setConnectTimeout(15000 /* milliseconds */);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
int response = urlConnection.getResponseCode();
inputStream = urlConnection.getInputStream();
readStream(inputStream);
得到的数据是JSON格式,需要进行JSON数据解析。JSON的全称是Javascript Object Notation,即Javascript对象符号,它是一种轻量级的数据交换格式。JSON的数据格式既适合人来读写,也适合计算机本事解析和生成。非常方便的是Android系统内置了对JSON的支持,在Android SDK 的org.JSON包下提供了JSONArray、JSONObject、JSONStringer等类,通过这些类即可非常方便的完成JSON字符串与JSONArray,JSONObject之间的相互转换。因为是实现签到功能所以这里省去了许多无关信息,只解析名字、时间等必要内容。解析过程代码如下:
String strResult = value;
JSONObject jsonObject=new JSONObject(strResult);
JSONArray jsonArray = jsonObject.getJSONArray("businesses");
JSONObject item = jsonArray.getJSONObject(0);
String name = item.getString("name");
Message msg = new Message();
msg.what = CODE;
msg.obj = name;
handler.sendMessage(msg);
解析完成后,转换为字符串类型调用setText()方法显示。由于应用没有经过审核所以返回的是测试数据。
得到上述信息后,就可以插入签到数据库了。点击右上角签到按钮,将textview的内容传到Findbusiness.java。本模块使用sqlite数据库。加载Findbusiness.xml页面布局,在签到按钮的监听器内使用execSQL方法直接写入SQL语句,创建表结构,代码如下。
db.execSQL("create table qiandao(_id integer"
+ " primary key autoincrement,"
+ " name varchar(255),"
+ " time varchar(255))");
private void insertData(SQLiteDatabase db, String content,String time )
{
db.execSQL("insert into qiandao values(null , ?, ? )"
, new String[] { name, time });
}
在签到按钮监听器内调用插入方法执行insert语句插入数据。insertData(db, name,time);
签到后将已经签到过的餐厅显示到页面上,使用rawQuery()方法直接写入SQL查询语句,返回得到Cursor结果集。将结果以列表的形式显示到页面上,需要使用CursorAdapter(Cursor结果集数据适配器)填充列表,在findbusiness.xml内添加listview,同时新建DB.xml添加俩个textview作为ListView中的每一列的View用于填充数据,实现代码如下:
Cursor cursor = db.rawQuery("select * from qiandao", null);
inflateList(cursor);
private void inflateList(Cursor cursor)
{
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
MainApp.this,
R.layout.db, cursor,
new String[] { "name", "time" }
, new int[] {R.id.title, R.id.content },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(adapter);}
5 小结
餐厅签到功能实现了对于系统GPS服务的调用,获取当前位置信息,实现了大众点评API的连接、调用。整个系统满足了需求分析中的得到的功能性需求。
参考文献:
[1] 李刚. 疯狂Android讲义[M].北京:电子工业出版社,2014.
[2] 迈耶,佘建伟,赵凯.Android 4 高级编程[M].北京:清华大学出版社,2013.
[3] 李宁.Android开发权威指南[M].北京:机械工业出版社,2011.
[4] 时贞军.基于SQLite的Android数据库编程[J].电脑编程技巧与维护,2011(21):30-31.
[5] 徐尤华.Android移动优化策略[J].计算机时代,2011,2(12):23-24.
[6] 佘志龙.Android SDK 开发范例大全[M].北京:人民邮电出版社,2011.
[7] Narayan Babu.Android application development skills[J].IT TIME WEEKLY,2012,6(8):55-58.
[8] Android API[EB/OL].http://Androidappdocs.appspot.com/index.html.2013-04-10.
[9] Srowen.ZXing docs[EB/OL].http://code.google.com/p/zxing.html, 2013.
[10] Bruce Eckle.Think in Java 2nd Edition[M].london:Prentice Hall,2000.