Android使用有道翻译API实如今线翻译功能
在Android应用中,加入在线翻译的功能,这里调用的是有道翻译的API。
使用有道翻译API。首先要申请一个key,申请地址为: path=data-mode">有道翻译API申请地址
申请之后就会得到一个keyfrom和一个key。
获取翻译结果的数据接口为:http://fanyi.youdao.com/openapi.do?
keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1.1&q=要翻译的文本。我们仅仅须要把内容拼接成这样。使用GET的方式。就能得到翻译的结果。
我翻译了“程序猿”,接口返回的数据为:
{
"translation": [
"The programmer"
],
"basic": {
"phonetic": "chéng xù yuán",
"explains": [
"programmer"
]
},
"query": "程序猿",
"errorCode": 0,
"web": [
{
"value": [
"Programmer",
"CODER",
"SCJP"
],
"key": "程序猿"
},
{
"value": [
"Systems Programmer",
"Java Card",
"system programmer"
],
"key": "系统程序猿"
},
{
"value": [
"programmer",
"computer programmer",
"Job-InterviewComputer Programmer"
],
"key": "电脑程序猿"
}
]
}
我们仅仅须要从中解析出我们所须要的内容就可以。
详细实现例如以下:
public class MainActivity extends Activity {
private EditText edit = null;
private TextView search = null;
private TextView text = null;
private String YouDaoBaseUrl = "http://fanyi.youdao.com/openapi.do";
private String YouDaoKeyFrom = "YouDaoKeyFrom";
private String YouDaoKey = "YouDaoKey";
private String YouDaoType = "data";
private String YouDaoDoctype = "json";
private String YouDaoVersion = "1.1";
private TranslateHandler handler;
private static final int SUCCEE_RESULT = 10;
private static final int ERROR_TEXT_TOO_LONG = 20;
private static final int ERROR_CANNOT_TRANSLATE = 30;
private static final int ERROR_UNSUPPORT_LANGUAGE = 40;
private static final int ERROR_WRONG_KEY = 50;
private static final int ERROR_WRONG_RESULT = 60;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
search = (TextView) findViewById(R.id.search);
search.setOnClickListener(new searchListener());
text = (TextView) findViewById(R.id.text);
handler = new TranslateHandler(this, text);
}
private class searchListener implements OnClickListener {
@Override
public void onClick(View v) {
String content = edit.getText().toString().trim();
if (content == null || "".equals(content)) {
Toast.makeText(getApplicationContext(), "请输入要翻译的内容", Toast.LENGTH_SHORT).show();
return;
}
final String YouDaoUrl = YouDaoBaseUrl + "?keyfrom=" + YouDaoKeyFrom + "&key=" + YouDaoKey + "&type="
+ YouDaoType + "&doctype=" + YouDaoDoctype + "&type=" + YouDaoType + "&version=" + YouDaoVersion
+ "&q=" + content;
new Thread() {
public void run() {
try {
AnalyzingOfJson(YouDaoUrl);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
private void AnalyzingOfJson(String url) throws Exception {
// 第一步,创建HttpGet对象
HttpGet httpGet = new HttpGet(url);
// 第二步,使用execute方法发送HTTP GET请求。并返回HttpResponse对象
HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 第三步。使用getEntity方法活得返回结果
String result = EntityUtils.toString(httpResponse.getEntity());
System.out.println("result:" + result);
JSONArray jsonArray = new JSONArray("[" + result + "]");
String message = null;
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (jsonObject != null) {
String errorCode = jsonObject.getString("errorCode");
if (errorCode.equals("20")) {
handler.sendEmptyMessage(ERROR_TEXT_TOO_LONG);
} else if (errorCode.equals("30 ")) {
handler.sendEmptyMessage(ERROR_CANNOT_TRANSLATE);
} else if (errorCode.equals("40")) {
handler.sendEmptyMessage(ERROR_UNSUPPORT_LANGUAGE);
} else if (errorCode.equals("50")) {
handler.sendEmptyMessage(ERROR_WRONG_KEY);
} else {
Message msg = new Message();
msg.what = SUCCEE_RESULT;
// 要翻译的内容
String query = jsonObject.getString("query");
message = "翻译结果:";
// 翻译内容
Gson gson = new Gson();
Type lt = new TypeToken<String[]>() {
}.getType();
String[] translations = gson.fromJson(jsonObject.getString("translation"), lt);
for (String translation : translations) {
message += "\t" + translation;
}
// 有道词典-基本词典
if (jsonObject.has("basic")) {
JSONObject basic = jsonObject.getJSONObject("basic");
if (basic.has("phonetic")) {
String phonetic = basic.getString("phonetic");
// message += "\n\t" + phonetic;
}
if (basic.has("explains")) {
String explains = basic.getString("explains");
// message += "\n\t" + explains;
}
}
// 有道词典-网络释义
if (jsonObject.has("web")) {
String web = jsonObject.getString("web");
JSONArray webString = new JSONArray("[" + web + "]");
message += "\n网络释义:";
JSONArray webArray = webString.getJSONArray(0);
int count = 0;
while (!webArray.isNull(count)) {
if (webArray.getJSONObject(count).has("key")) {
String key = webArray.getJSONObject(count).getString("key");
message += "\n(" + (count + 1) + ")" + key + "\n";
}
if (webArray.getJSONObject(count).has("value")) {
String[] values = gson.fromJson(webArray.getJSONObject(count).getString("value"),
lt);
for (int j = 0; j < values.length; j++) {
String value = values[j];
message += value;
if (j < values.length - 1) {
message += "。";
}
}
}
count++;
}
}
msg.obj = message;
handler.sendMessage(msg);
}
}
}
text.setText(message);
} else {
handler.sendEmptyMessage(ERROR_WRONG_RESULT);
}
}
private class TranslateHandler extends Handler {
private Context mContext;
private TextView mTextView;
public TranslateHandler(Context context, TextView textView) {
this.mContext = context;
this.mTextView = textView;
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCEE_RESULT:
mTextView.setText((String) msg.obj);
closeInput();
break;
case ERROR_TEXT_TOO_LONG:
Toast.makeText(mContext, "要翻译的文本过长", Toast.LENGTH_SHORT).show();
break;
case ERROR_CANNOT_TRANSLATE:
Toast.makeText(mContext, "无法进行有效的翻译", Toast.LENGTH_SHORT).show();
break;
case ERROR_UNSUPPORT_LANGUAGE:
Toast.makeText(mContext, "不支持的语言类型", Toast.LENGTH_SHORT).show();
break;
case ERROR_WRONG_KEY:
Toast.makeText(mContext, "无效的key", Toast.LENGTH_SHORT).show();
break;
case ERROR_WRONG_RESULT:
Toast.makeText(mContext, "提取异常", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
super.handleMessage(msg);
}
}
public void closeInput() {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if ((inputMethodManager != null) && (this.getCurrentFocus() != null)) {
inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
看一下效果:
补充:翻译的文本应该要经过编码才干够,防止特殊字符。
URLEncoder.encode(content);
Android使用有道翻译API实如今线翻译功能的更多相关文章
- 百度翻译api 实现简易微信翻译小程序
介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示 使用百度翻译api需要申请 appid 与 key 并在 ap ...
- WebView调用有道词典实如今线查词
WebView(网络视图)能载入显示网页,能够将其视为一个浏览器.它使用了WebKit渲染引擎载入显示网页,用法非常easy,直接在XML文件里写入webview控件就可以,主要代码例如以下: ...
- Python 调用百度翻译API
由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...
- WP8.1小梦词典开发2:百度翻译API使用
原文出自:http://www.bcmeng.com/api2/ 小梦昨天和大家分享了WP8.1金山词霸API使用方法,今天继续分享windows phone 8.1中百度翻译API的使用方法.和昨天 ...
- 小白学Python——用 百度翻译API 实现 翻译功能
本人英语不好,很多词组不认识,只能借助工具:百度翻译和谷歌翻译都不错,近期自学Python,就想能否自己设计一个百度翻译软件呢? 百度翻译开放平台: http://api.fanyi.baidu.co ...
- 申请百度翻译API
申请百度翻译API 0x00 前期准备 百度账号 md5的相关知识 0x01 进入百度开放平台,登录你的百度账号 找到 产品服务 -> 通用翻译API 0x02 点击下面的立即使用按钮,注册成为 ...
- [Python] 使用有道翻译API
Python 使用youdao (有道翻译)API 想写一个给自己记录背单词状况的软件,需要获取英文单词的中文释义(基本功能).考虑使用有道翻译的API实现获取英文单词的中文释义的方法. 获取API_ ...
- 调用有道翻译API
前两天朋友说起NASA开放了数据API,今儿突然想起从来没用过外部提供的API,然而简单用得多的貌似是有道词典API,就像试试,本来觉得应该挺简单的,用urllib模块很快就实现了. 不过测试时才发现 ...
- 记微信开发(有道翻译api)
记微信开发(有道翻译api) 记微信开发(有道翻译api) 效果: 有道翻译api申请: 地址:http://fanyi.youdao.com/openapi code: <?php/** * ...
随机推荐
- ZooKeeper分布式集群部署及问题
ZooKeeper为分布式应用系统提供了高性能服务,在许多常见的集群服务中被广泛使用,最常见的当属HBase集群了,其他的还有Solr集群.Hadoop-2中的HA自己主动故障转移等. 本文主要介绍了 ...
- [Phonegap+Sencha Touch] 移动开发19 某些安卓手机上弹出消息框 点击后不消失的解决的方法
Ext.Msg.alert等弹出框在某些安卓手机上,点击确定后不消失. 原因是: 消息框点击确定后有一段css3 transform动画,动画完毕后才会隐藏(display:none). 有些奇葩手机 ...
- jQuery插件 -- Cookie插件
Cookie是站点设计者放置在client的小文本文件.Cookie能为用户提供非常多的使得,比如购物站点存储用户以前浏览过的产品列表.或者门户站点记住用户喜欢选择浏览哪类新闻. 在用户同意的情况下. ...
- 【MySQL】MySQL删除匿名用户,保证登录安全
博客地址已迁往 www.virtclouds.com 原文地址 http://www.virtclouds.com/538.html 很多MySQL程序都会带有匿名登录的功能. 在刚刚安装完MySQL ...
- caffe:使用C++来提取任意一张图片的特征
0x00 关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在depl ...
- maven的pom.xml配置标签
转自:https://blog.csdn.net/wf787283810/article/details/76188595 <project xmlns="http://maven.a ...
- 4. Median of Two Sorted Arrays[H]两个有序数组的中位数
题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the midian of the ...
- Excel—— [导入到数据库] or 将数据 [导入到Excel]
将Excel导入到数据库实现如下: 前台代码: @model IEnumerable<Model.Student> @{ Layout = null; } <!DOCTYPE htm ...
- Centos7 minimal 系列之rabbitmq安装(八)
一.安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. 这种方法网站访问不了 wget https://packages.erlang-solutions.com/ ...
- EF Code First 使用 代码优先迁移(二)
第一步:如果不是建立的MVC项目,可能需要在控制台输入 :Install-Package EntityFramework 删除之后在执行Enable-Migrations 第二步:添加你需要修改的属性 ...