王麗娟++王妍
摘要:用戶在傳統(tǒng)的Web 2.0網(wǎng)站上主要通過手工方式輸入和搜索各類信息。隨著智能手機等移動設備的普及,以及智能手機所提供的傳感器數(shù)量和種類的增加,以多模態(tài)方式輸入和搜索信息成為可能。設計并實現(xiàn)一個移動應用程序,為傳統(tǒng)的Web 2.0網(wǎng)站增加多模態(tài)輸入功能。以豆瓣網(wǎng)(www.douban.com)和大眾點評網(wǎng)(www.dianping.com)為例,程序應能夠:通過手機掃描圖書條形碼,來搜索圖書信息,并記錄于用戶的豆瓣賬號內;通過“搖一搖”功能搜索正在播放的音樂,并記錄于用戶的豆瓣賬號內;通過GPS定位功能搜索周邊商戶,并在用戶的大眾點評賬號中進行簽到。
關鍵詞:Android;智能手機;應用軟件;多模態(tài)
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)29-0072-03
在智能手機的時代,在網(wǎng)絡全球化的今天,手機儼然成為個人的“超級計算機”,深入生活的方方面面,人們越來越離不開智能手機。其中Android系統(tǒng)的迅猛發(fā)展,一定程度上加快了智能手機的普及速度。移動設備的普及,以及智能手機所提供的傳感器種類和數(shù)量的增加,使通過移動終端以多種方式輸入、記錄和搜索信息成為可能。
基于以上原因,本文提出的“為Web2.0網(wǎng)站增加多模態(tài)輸入的Android應用的設計與實現(xiàn)”這一設想,是設計一個利用手機提供的多種傳感器實現(xiàn)以多種方式輸入、記錄和搜索信息的Android應用。進入信息時代以來,越來越多的信息涌入人們的生活,方便快捷的搜索、獲取和整理信息顯得尤為重要,因此本設計在日常生活中將有著不錯的實用性。
1 功能需求分析
本軟件是一個Android應用程序,可以通過手機所具備的各種傳感器記錄和搜索用戶一天的各種活動,使用戶通過手機與Web 2.0網(wǎng)站的交互更為方便快捷。軟件的基本功能需求如下:
記錄文字圖片功能,用戶可以通過App記錄文字、照片,保存文本信息和時間,編輯和管理文本信息,并且可以導出所記錄的文字信息,以txt純文本格式保存。圖片可以通過相機獲取,也可以添加本地圖片。
掃描圖書功能,用戶可以通過手機的攝像頭掃描書籍的條形碼,App會返回豆瓣網(wǎng)(www.douban.com)API所查找到的書籍信息。如果擁有豆瓣賬戶則可以登錄,并收藏此書籍。用戶也可以輸入自己的信息生成二維碼供其他用戶掃描,使信息分享更為快捷。
查找餐廳簽到功能,在用戶打開GPS的情況下,App會通過大眾點評網(wǎng)(www.dianping.com)API返回當前位置最近的餐廳信息,用戶簽到后,App會保存相關信息到手機中。如果用戶手機中已經(jīng)安裝大眾點評的App,則可以瀏覽更加詳細的信息
2 系統(tǒng)開發(fā)環(huán)境
本設計開發(fā)工具為Eclipse Java EE IDE for Web Developers,版本: Kepler Service Release 2。 SDK(軟件開發(fā)工具包)版本為22.6.2。
3 系統(tǒng)設計
3.1系統(tǒng)整體設計
根據(jù)系統(tǒng)需求分析可知,軟件共有三個功能模塊:文字圖片模塊、掃描圖書模塊、餐廳簽到模塊。系統(tǒng)和用戶交互時需要直觀的圖形化界面,所以本項目共需要7個用戶界面類,分別是MainActivity(軟件主界面)、BWActivity(文字圖片模塊主界面)、BWNewActivity(文字圖片模塊輸入界面)、Book(掃描圖書功能主界面)、Book_view(掃描圖書結果顯示界面)、Main_Location(餐廳簽到功能主界面)、Findbusiness(餐廳簽到信息顯示界面)。
4功能實現(xiàn)
本文主要針對餐廳簽到功能模塊設計與實現(xiàn)進行詳細說明。餐廳簽到功能流程圖見圖1。
餐廳簽到功能模塊主要分為三個部分,調用GPS獲取當前位置信息,根據(jù)位置參數(shù)通過大眾點評API獲取當前位置餐廳信息,建立簽到數(shù)據(jù)庫。主要文件見表1。
表1 餐廳簽到功能主要文件說明
[文件名\&說明\&Main_location.java\&主界面activity\& Findbusiness.java\&API連接、簽到activity\&Main_location.xml\&主界面布局文件\&Findbusiness.xml\&結果顯示頁面布局文件\&Db.xml\&數(shù)據(jù)庫列表顯示布局文件\&]
圖1 餐廳簽到功能流程圖
Android為使用GPS功能支持專門提供了一個LocationManger類,所有GPS定位相關的服務、對象都將由該對象產(chǎn)生。程序并不能直接創(chuàng)建LocationManger的實例,而是通過調用Context的getSystemService()方法來獲取。首先AndroidManifest.xml文件中配置GPS和網(wǎng)絡使用權限,代碼如下:
LocationManager類調用getSystemService(Context.LOCATION_SERVICE)獲取系統(tǒng)GPS服務,新建Location類調用locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)獲得最后更新的GPS信息,最后調用location.getLatitude(),location.getLongtitude()方法分別獲得經(jīng)緯度信息。
得到String類型的經(jīng)度緯度參數(shù)后傳到Findbusiness.java,F(xiàn)indbusiness.java這個Activity主要負責與大眾點評API的連接及餐廳信息的搜索。使用大眾點評API需要申請APIkey與密鑰,目前只是測試用,所以返回的是測試數(shù)據(jù)。APIurl:http://api.dianping.com/v1/business/find_businesses 請求方法為HTTP GET,請求參數(shù)說明見表2。
表2 請求參數(shù)表
[參數(shù)\&必選/可選\&描述\&Format=json\&必選\&數(shù)據(jù)格式為json\&Latitude=x\&必選\&經(jīng)度信息\&Longitude=y\&必選\&緯度信息\&Category=美食\&必選\&信息分類\&Limit=5\&必選\&返回數(shù)量\&Radius=2000\&必選\&搜索半徑\&offset_type=0\&必選\&偏移類型未偏移\&Sort=7\&必選\&結果排序:離傳入經(jīng)緯度坐標距離近優(yōu)先\&]
對APIkey、密鑰與參數(shù)進行字符串連接,根據(jù)密鑰和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方式請求數(shù)據(jù),具體代碼如下:
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);
得到的數(shù)據(jù)是JSON格式,需要進行JSON數(shù)據(jù)解析。JSON的全稱是Javascript Object Notation,即Javascript對象符號,它是一種輕量級的數(shù)據(jù)交換格式。JSON的數(shù)據(jù)格式既適合人來讀寫,也適合計算機本事解析和生成。非常方便的是Android系統(tǒng)內置了對JSON的支持,在Android SDK 的org.JSON包下提供了JSONArray、JSONObject、JSONStringer等類,通過這些類即可非常方便的完成JSON字符串與JSONArray,JSONObject之間的相互轉換。因為是實現(xiàn)簽到功能所以這里省去了許多無關信息,只解析名字、時間等必要內容。解析過程代碼如下:
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()方法顯示。由于應用沒有經(jīng)過審核所以返回的是測試數(shù)據(jù)。
得到上述信息后,就可以插入簽到數(shù)據(jù)庫了。點擊右上角簽到按鈕,將textview的內容傳到Findbusiness.java。本模塊使用sqlite數(shù)據(jù)庫。加載Findbusiness.xml頁面布局,在簽到按鈕的監(jiān)聽器內使用execSQL方法直接寫入SQL語句,創(chuàng)建表結構,代碼如下。
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 });
}
在簽到按鈕監(jiān)聽器內調用插入方法執(zhí)行insert語句插入數(shù)據(jù)。insertData(db, name,time);
簽到后將已經(jīng)簽到過的餐廳顯示到頁面上,使用rawQuery()方法直接寫入SQL查詢語句,返回得到Cursor結果集。將結果以列表的形式顯示到頁面上,需要使用CursorAdapter(Cursor結果集數(shù)據(jù)適配器)填充列表,在findbusiness.xml內添加listview,同時新建DB.xml添加倆個textview作為ListView中的每一列的View用于填充數(shù)據(jù),實現(xiàn)代碼如下:
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 小結
餐廳簽到功能實現(xiàn)了對于系統(tǒng)GPS服務的調用,獲取當前位置信息,實現(xiàn)了大眾點評API的連接、調用。整個系統(tǒng)滿足了需求分析中的得到的功能性需求。
參考文獻:
[1] 李剛. 瘋狂Android講義[M].北京:電子工業(yè)出版社,2014.
[2] 邁耶,佘建偉,趙凱.Android 4 高級編程[M].北京:清華大學出版社,2013.
[3] 李寧.Android開發(fā)權威指南[M].北京:機械工業(yè)出版社,2011.
[4] 時貞軍.基于SQLite的Android數(shù)據(jù)庫編程[J].電腦編程技巧與維護,2011(21):30-31.
[5] 徐尤華.Android移動優(yōu)化策略[J].計算機時代,2011,2(12):23-24.
[6] 佘志龍.Android SDK 開發(fā)范例大全[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.