因为某些原因,我需要记单词,而且讨厌广告,所以就想着自己写个能够查自己不认识的单词并且以后可以随时查看的APP。
首先我需要调用一个翻译API,中文翻译比较好用的API有有道翻译API,百度翻译API等,因为先期用过百度地图API,觉得很好用,所以我先查阅了百度翻译API
觉得还不错,因为我写的APP是给自己用的,所以这肯定够用,然后我就申请了一个API接口,当我看了文档之后,百度为了安全的原因,在现版本的接口中加入了签名,通过一定的输入序列形成MD5序列,而这个感觉有点麻烦,虽然我后来试了下,可以用的,但是当时觉得时间不多,就转而使用了有道翻译API
首先要做的肯定是申请key,然后看了下API接入文档,发现有道的API很简单粗暴,其数据接口为:
官方说明
版本: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 - 无词典结果,仅在获取词典结果生效
/openapi.do?keyfrom=&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 voidSentInquire(String q) {
HttpClient httpClient= newDefaultHttpClient();
String ServerUrl= urlString +q;
String data_backString= "";
HttpPost httpRequst= newHttpPost(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 = newJSONObject(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= newJSONArray(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 = newJSONArray(
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中显示
这样我应用的核心部分完成了
完整代码下载地址