標籤:方式 tpc rar lock 翻譯 art 程式 pre 主線程
因為某些原因,我需要記單詞,而且討厭廣告,所以就想著自己寫個能夠查自己不認識的單詞並且以後可以隨時查看的APP。
首先我需要調用一個翻譯API,中文翻譯比較好用的API有有道翻譯API,百度翻譯API等,因為先期用過百度地圖API,覺得很好用,所以我先查閱了百度翻譯API
覺得還不錯,因為我寫的APP是給自己用的,所以這肯定夠用,然後我就申請了一個API介面,當我看了文檔之後,百度為了安全的原因,在現版本的介面中加入了簽名,通過一定的輸入序列形成MD5序列,而這個感覺有點麻煩,雖然我後來試了下,可以用的,但是當時覺得時間不多,就轉而使用了有道翻譯API
首先要做的肯定是申請key,然後看了下API接入文檔,發現有道的API很簡單粗暴,其資料介面為:
http://fanyi.youdao.com/openapi.do?keyfrom=&key=&type=data&doctype=&version=1.1&q=要翻譯的文本
官方說明
版本:1.1,請求方式:get,編碼方式:utf-8
主要功能:中英互譯,同時獲得有道翻譯結果和有道詞典結果(可能沒有)
參數說明:
type - 返回結果的類型,固定為data
doctype - 返回結果的資料格式,xml或json或jsonp
version - 版本,當前最新版本為1.1
q - 要翻譯的文本,必須是UTF-8編碼,字元長度不能超過200個字元,需要進行urlencode編碼
only - 選擇性參數,dict表示只擷取詞典資料,translate表示只擷取翻譯資料,預設為都擷取
註: 詞典結果只支援中英互譯,翻譯結果支援英日韓法俄西到中文的翻譯以及中文到英語的翻譯
errorCode:
0 - 正常
20 - 要翻譯的文本過長
30 - 無法進行有效翻譯
40 - 不支援的語言類型
50 - 無效的key
60 - 無詞典結果,僅在擷取詞典結果生效
http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=json&version=1.1&q=good{ "errorCode":0 "query":"good", "translation":["好"], // 有道翻譯 "basic":{ // 有道詞典-基本詞典 "phonetic":"g?d" "uk-phonetic":"g?d" //英式發音 "us-phonetic":"ɡ?d" //美式發音 "explains":[ "好處", "好的" "好" ] }, "web":[ // 有道詞典-網路釋義 { "key":"good", "value":["良好","善","美好"] }, {...} ]}
其中我需要就更改q也就是需要查詢的對象就可以了,其他可以通過Java寫入String中
我的思路就是通過發送HTTP請求返回所需要的翻譯結果資料,然後對返回來的JSON進行解析就可以了,以下是我所使用的代碼
private void SentInquire(String q) { HttpClient httpClient = new DefaultHttpClient(); String ServerUrl = urlString + q; String data_backString = ""; HttpPost httpRequst = new HttpPost(ServerUrl); try { HttpResponse response = httpClient.execute(httpRequst); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { data_backString = EntityUtils.toString(response.getEntity());//接收返回的資料 System.out.println(data_backString); Log.i(TAG, "result = " + data_backString); //以下為JSON資料解析 try { // JSONArray jsonArray = new JSONArray(data_backString); JSONObject jsonObject2 = new JSONObject(data_backString); // String string=jsonObject2.getString("translation"); // receiveString=string; // JSONObject jsonObject3=new // JSONObject(jsonObject2.getString("basic")); JSONObject jsonObject3 = (JSONObject) jsonObject2 .get("basic"); receiveString = jsonObject3.getString("explains"); JSONArray jsonArray1 = new JSONArray(receiveString); receiveString = ""; for (int i = 0; i < jsonArray1.length(); i++) { receiveString += jsonArray1.getString(i) + "\n"; } // String[] strarray=receiveString.split(","); /* * for (int i = 0; i < strarray.length; i++) { //String * mytemp * =strarray[i].substring(strarray[i].indexOf("‘"),strarray * [i].indexOf("‘")); receiveString+=mytemp+"\n"; } */ JSONArray jsonArray = jsonObject2.getJSONArray("web"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObjectSon = (JSONObject) jsonArray .opt(i); receiveString += jsonObjectSon.getString("key"); receiveString += ":"; // String valueTemp=jsonObjectSon.getString("value"); JSONArray valueArray = new JSONArray( jsonObjectSon.getString("value")); for (int j = 0; j < valueArray.length(); j++) { receiveString += valueArray.getString(j); } receiveString += "\n"; } mHandler.sendEmptyMessage(0); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); System.out.println("-----出現異常------"); } } } catch (Exception e) { // TODO: handle exception } }
測試程式中返回來的JSON資料
{“translation”:[“協助”],”basic”:{“us-phonetic”:”h?lp”,”phonetic”:”help”,”uk-phonetic”:”help”,”explains”:[“n. 協助;補救辦法;幫忙者;有益的東西”,”vt. 協助;促進;治療;補救”,”vi. 協助;有用;招待”,”n. (Help)人名;(芬)海爾普”]},”query”:”help”,”errorCode”:0,”web”:[{“value”:[“協助”,”幫忙”,”協助文檔”],”key”:”Help”},{“value”:[“自取所需”,”自用”,”自己動手”],”key”:”help oneself”},{“value”:[“幫幫忙”,”幫個大忙”,”協助解決問題”],”key”:”Help out”}]}
解析JSON資料部分我從CSDN大神那兒學習的
特別注意一點,發送網路請求不能在主線程中進行,這是很多部落格沒有說明的,我們只需要開闢一個新的線程就可以了還有不能在該線程中直接對view進行修改,需要通過handler發送修改view例如在textview中顯示
這樣我應用的核心部分完成了
完整代碼
Android應用記錄一:有道翻譯API調用