文章目录
百度翻译API教程(完整Android代码)
1.前期准备
这里直接copy了官网的指南。
- 登录百度翻译开放平台(http://api.fanyi.baidu.com);
- 注册成为开发者,获得APPID;
- 进行开发者认证(如仅需标准版可跳过);
- 开通通用翻译API服务:开通链接
- 参考技术文档和Demo编写代码
好吧,这些注册,开通服务就不废话了,没啥好说的,官方有很详细的使用指导,看看怎么在Android开发中用吧(当然不限于这个使用场景,还有小程序/网页/后端等),直接介绍第五步吧,参考技术文档和Demo编写代码。
2.简述官网通用翻译API
通用翻译API通过HTTP接口对外提供多语种互译服务。您只需要通过调用通用翻译API,传入待翻译的内容,并指定要翻译的源语言(支持源语言语种自动检测)和目标语言种类,就可以得到相应的翻译结果。
通用翻译API HTTP地址
http://api.fanyi.baidu.com/api/trans/vip/translate
通用翻译API HTTPS地址
https://fanyi-api.baidu.com/api/trans/vip/translate
这里用https举例,使用HTTP协议需要额外加一个网络配置文件(Android 9.0),具体可参考我之前的文章:
接口需要的参数如下,引用官网的图片。
ok,到这里已经可以开始编码了。
3.使用百度通用翻译API
3.1 申请网络权限
<!-- 网络权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
3.2 导入Retrofit
//网络请求 Retrofit库(基于okHttp封装的网络请求库)
implementation 'com.squareup.okhttp3:okhttp:4.1.0'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2' // 用Gson解析json的转换器
3.3 编写请求服务接口
package com.keshe.myapplication;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
//源URL https://fanyi-api.baidu.com/api/trans/vip/translate
//参数如下
// String q 英文单词/中文
// String from 原始语种 zh中文/eh英文
// String to 目标语种 zh中文/eh英文
// String from zh中文/eh英文
// String appid 你的appid
// String salt 随机数(整形转字符串)
// String sign 签名 32位字母小写MD5编码的 appid+q+salt+密钥
public interface BaiduTranslateService {
//翻译接口
//表示提交表单数据,@Field注解键名
//适用于数据量少的情况
@POST("translate")
@FormUrlEncoded
Call<RespondBean> translate(@Field("q") String q, @Field("from") String from, @Field("to") String to, @Field("appid") String appid, @Field("salt") String salt,
@Field("sign") String sign);
}
3.4 MD5加密工具类
请求接口中,参数sign签名需要MD5加密(32字母小写),因此编写一个MD5加密工具类供之后使用。
package com.keshe.myapplication;
import java.security.MessageDigest;
/**
* 加密解密工具类(对字符串加密) MD5加密
*/
public class MD5Utils {
/**
* MD5加密算法使用 对字符串加密
*
* @param info 参数为需要加密的String
* @return 返回加密后的String
*/
public static String getMD5Code(String info) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(info.getBytes("utf-8"));//设置编码格式
byte[] encryption = md5.digest();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < encryption.length; i++) {
if (Integer.toHexString(0xff & encryption[i]).length() == 1) {
stringBuffer.append("0").append(Integer.toHexString(0xff & encryption[i]));
} else {
stringBuffer.append(Integer.toHexString(0xff & encryption[i]));
}
}
return stringBuffer.toString();
} catch (Exception e) {
return "MD5加密异常";
}
}
}
3.5 根据服务器响应JSON生成实体类
使用postman调式接口,试一下接口,主要是为了拿到JSON。
服务器响应的JSON
{
"from": "zh",
"to": "en",
"trans_result": [
{
"src": "你好",
"dst": "Hello"
}
]
}
使用高能gsonformat插件自动生成java实体类,没有使用的同学可以参考以下文章(虽然文章中的接口已经不能用了,但使用gsonformat插件自动生成java实体类的思路没错)
自动生成的实体类如下:
package com.keshe.myapplication;
import java.util.List;
class RespondBean {
/**
* from : en
* to : zh
* trans_result : [{"src":"can","dst":"可以"}]
*/
private String from;
private String to;
private List<TransResultBean> trans_result;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public List<TransResultBean> getTrans_result() {
return trans_result;
}
public void setTrans_result(List<TransResultBean> trans_result) {
this.trans_result = trans_result;
}
public static class TransResultBean {
/**
* src : can
* dst : 可以
*/
private String src;
private String dst;
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getDst() {
return dst;
}
public void setDst(String dst) {
this.dst = dst;
}
}
}
3.6 活动和视图
视图很简易就三个原生的控件EditText,Button,TextView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"></EditText>
<Button
android:onClick="translate"
android:id="@+id/bt_translate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/et_word"
android:text="翻译"></Button>
<TextView
android:layout_centerHorizontal="true"
android:id="@+id/tv_result"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/bt_translate"></TextView>
</RelativeLayout>
MainActivity代码如下,使用Retrofit请求接口,完整代码(含注释)如下:
只需修改其中的两处代码即可:
String appid = “你的appid”;//appid 管理控制台有
String key = “你的密钥”;//密钥 管理控制台有
package com.keshe.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
String TAG = "MainActivity";
Button button;
EditText editText;
TextView textView;
static String to;//目标译文 可变 zh中文 en英文
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.bt_translate);
editText = findViewById(R.id.et_word);
textView = findViewById(R.id.tv_result);
}
//Button onclick属性对应的监听函数
public void translate(View view) {
//准备请求百度翻译接口需要的参数
String word = editText.getText().toString();//需查询的单词 q
String from = "auto";//源语种 en 英语 zh 中文
//String中英文占用一个字节,中文占用两个字节,
//利用String的这个存储特性可以用来判断String中有没有中文。
//原文链接:https://blog.csdn.net/u012005549/article/details/82685063
if (word.length() == word.getBytes().length) {//成立则说明没有汉字,否则由汉字。
to = "zh"; //没有汉字 英译中
} else {
to = "en";//含有汉字 中译英
}
String appid = "你的appid";//appid 管理控制台有
String salt = (int) (Math.random() * 100 + 1) + "";//随机数 这里范围是[0,100]整数 无强制要求
String key = "你的密钥";//密钥 管理控制台有
String string1 = appid + word + salt + key;// string1 = appid+q+salt+密钥
String sign = MD5Utils.getMD5Code(string1);// 签名 = string1的MD5加密 32位字母小写
Log.d(TAG, "string1:" + string1);
Log.d(TAG, "sign: " + sign);
Retrofit retrofitBaidu = new Retrofit.Builder()
.baseUrl("https://fanyi-api.baidu.com/api/trans/vip/")
.addConverterFactory(GsonConverterFactory.create()) // 设置数据解析器
.build();
BaiduTranslateService baiduTranslateService = retrofitBaidu.create(BaiduTranslateService.class);
Call<RespondBean> call = baiduTranslateService.translate(word, from, to, appid, salt, sign);
call.enqueue(new Callback<RespondBean>() {
@Override
public void onResponse(Call<RespondBean> call, Response<RespondBean> response) {
//请求成功
Log.d(TAG, "onResponse: 请求成功");
RespondBean respondBean = response.body();//返回的JSON字符串对应的对象
String result = respondBean.getTrans_result().get(0).getDst();//获取翻译的字符串String
Log.d(TAG, "英译中结果" + result);
textView.setText(result);
}
@Override
public void onFailure(Call<RespondBean> call, Throwable t) {
//请求失败 打印异常
Log.d(TAG, "onResponse: 请求失败 " + t);
}
});
}
}
其中的代码就不详细解释了,可以查看注释。
4.demo运行结果
嗯…demo就该有demo的亚子,界面简洁明了,代码也不多。
其中判断字符串是否含有中文是根据这篇博客:
如何判断一个字符串中有没有中文
至此,完成了百度通用翻译API的使用,实现了自动根据输入完成中英互译,可以中译英,也可英译中。