百度翻译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的使用,实现了自动根据输入完成中英互译,可以中译英,也可英译中。
在这里插入图片描述

发布了67 篇原创文章 · 获赞 32 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42391904/article/details/103727736