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/** * ...
随机推荐
- 一个简单的推断抢购时间是否到达的js函数
原型函数,功能非常easy,找到时钟的id,计算数值.到达抢购时间时运行任务. function nwt() {var str=$('#deal_expiry_timer_e3cdcd2a').tex ...
- [C++设计模式] iterator 迭代器模式
迭代器模式定义:提供一种方法顺序訪问一个聚合对象中各个元素,而又不须要暴露该对象. 迭代器分内部迭代器和外部迭代器.内部迭代器与对象耦合紧密,不推荐使用. 外部迭代器与聚合容器的内部对象松耦合,推荐使 ...
- Struts2值栈的相关操作
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import ...
- DB-MySQL:MySQL 连接的使用
ylbtech-DB-MySQL:MySQL 连接的使用 1.返回顶部 1. Mysql 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多 ...
- windows中安装redis的phpredis扩展
1. 下载php的redis扩展 打开网址 http://pecl.php.net/ (php的扩展库官网),搜索redis,进入地址:http://pecl.php.net/package/redi ...
- python 3.x 学习笔记17(协程以及I/O模式)
1.协程(微线程)协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上一 ...
- Js基础知识(作用域、特殊函数---自调、回调、作为值的函数)
15.作用域 概念: 规定变量或函数的可被访问的范围和生命周期 分类: 全局作用域 -就是指当前整个页面环境: 局部作用域(函数作用域) -就是指某个函数内部环境 l 变量的作用域 全局变量 - 定义 ...
- SwipeRefreshLayout的使用,下拉刷新
1. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android ...
- DB2load遇到SQL3508N错误
SQL3508N装入或装入查询期间,当存取类型为 "<文件类型>" 的文件或路径时出错.原因码:"<原因码>".路径:"< ...
- SQL SERVER中的sys.objects和sysobjects的区别
这三个视图都是存在于SQL Server的每个数据库中.在SQL Server 2000中,它们都是系统表,而不是视图. 关于两个版本中系统表和系统的视图的对应关系,参考:http://technet ...