1. 程式人生 > >Android應用記錄一:有道翻譯API調用

Android應用記錄一:有道翻譯API調用

.get 返回結果 是我 git 最新版 cts json數據 調用 sla

因為某些原因,我需要記單詞,而且討厭廣告,所以就想著自己寫個能夠查自己不認識的單詞並且以後可以隨時查看的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調用