百度翻译API教程(完整Android代码)

百度翻译API教程(完整Android代码)

1.前期准备

这里直接copy了官网的指南。

  1. 登录百度翻译开放平台(http://api.fanyi.baidu.com);
  2. 注册成为开发者,获得APPID;
  3. 进行开发者认证(如仅需标准版可跳过);
  4. 开通通用翻译API服务:开通链接
  5. 参考技术文档和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),具体可参考我之前的文章:

Android 9.0 网络适配 使用http协议

接口需要的参数如下,引用官网的图片。

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。

百度翻译postman

服务器响应的JSON

{
    "from": "zh",
    "to": "en",
    "trans_result": [
        {
            "src": "你好",
            "dst": "Hello"
        }
    ]
}

使用高能gsonformat插件自动生成java实体类,没有使用的同学可以参考以下文章(虽然文章中的接口已经不能用了,但使用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的使用,实现了自动根据输入完成中英互译,可以中译英,也可英译中。
在这里插入图片描述

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
当然,我可以帮你提供一个使用百度翻译 APIAndroid 代码示例。在使用之前,请确保已经申请到了百度翻译 API 的密钥。 首先,在你的 Android 项目中,创建一个新的 Java 类,例如 `BaiduTranslateUtil`。然后在该类中添加以下代码: ```java import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class BaiduTranslateUtil { private static final String API_URL = "https://fanyi-api.baidu.com/api/trans/vip/translate"; private static final String API_KEY = "YOUR_API_KEY"; private static final String API_SECRET = "YOUR_API_SECRET"; public interface TranslationCallback { void onTranslationComplete(String result); void onTranslationError(String errorMessage); } public static void translate(String text, String sourceLanguage, String targetLanguage, TranslationCallback callback) { String encodedText = URLEncoder.encode(text); String url = API_URL + "?q=" + encodedText + "&from=" + sourceLanguage + "&to=" + targetLanguage + "&appid=" + API_KEY + "&salt=123456&sign=" + generateSign(text); new TranslationTask(callback).execute(url); } private static String generateSign(String text) { String sign = API_KEY + text + "123456" + API_SECRET; sign = MD5Util.encode(sign); return sign; } private static class TranslationTask extends AsyncTask<String, Void, String> { private TranslationCallback callback; public TranslationTask(TranslationCallback callback) { this.callback = callback; } @Override protected String doInBackground(String... urls) { try { URL url = new URL(urls[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); return response.toString(); } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(String result) { if (result != null) { Log.d("Translation", result); callback.onTranslationComplete(result); } else { callback.onTranslationError("Translation error occurred."); } } } } ``` 在上述代码中,你需要将 `YOUR_API_KEY` 和 `YOUR_API_SECRET` 替换为你在百度翻译 API 平台上申请到的密钥。 接下来,你可以在你的 Activity 或 Fragment 中使用 `BaiduTranslateUtil` 类的 `translate` 方法来调用百度翻译 API。例如: ```java BaiduTranslateUtil.translate("Hello world!", "en", "zh", new BaiduTranslateUtil.TranslationCallback() { @Override public void onTranslationComplete(String result) { // 处理翻译结果 } @Override public void onTranslationError(String errorMessage) { // 处理翻译错误 } }); ``` 这个示例代码会将英文的 "Hello world!" 翻译成中文。你可以根据自己的需求修改源语言和目标语言。 请注意,该示例代码仅提供了基本的使用方法,并未处理网络请求的线程问题。在实际开发中,你可能需要使用更合适的网络请求库来处理异步请求和错误处理。 希望这能帮到你!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值