Android开发集成百度翻译SDK

来源:互联网 发布:数控铣床简单编程实例 编辑:程序博客网 时间:2024/04/29 20:26

(本Demo的开发环境为Android Studio)


1.先去百度翻译开放平台(http://api.fanyi.baidu.com/api/trans/product/index)申请APP ID和密钥(过程省略,申请过程不要嫌麻烦就可以了),之后进入“管理控制台”便可以查看




之后下载官方的Demo,下载地址http://api.fanyi.baidu.com/api/trans/product/apidoc (在“各语言Demo”下,选择Java版)。


2.将下载好的Demo中的所有jar包引入项目中(不会引jar包的请参见 http://blog.csdn.net/highboys/article/details/51549679 ),运行demo的时候可能会报一些文件重复引入的错误,则在build.gradle文件中加入以下语句就可解决了(注意下面图片中语句加入的位置——android{ }中):

packagingOptions {        exclude 'META-INF/NOTICE' // will not include NOTICE file        exclude 'META-INF/DEPENDENCIES' // will not include LICENSE file    }



3.实现百度翻译功能的过程如下:


①拼接一个  appid + 需要翻译的字符串 + 一个随机数 + 密钥 的字符串

②将上面得到的字符串通过MD5加密,得到一个签名 sign

③将百度翻译提供的一个http API(一个URL) +  需要翻译的字符串 +待翻译文本的语言类型(from) +目标文本类型(to)+appid+ 随机数 +签名sign 拼接成一个URL,进行网络访问,会得到一个翻译结果的json格式的字符串。

④从json字符串中取出结果,呈现出来


具体说明请参见 百度翻译接入文档  http://api.fanyi.baidu.com/api/trans/product/apidoc


下面是主要的java代码(新建一个类)

import android.os.AsyncTask;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLDecoder;import java.net.URLEncoder;import java.util.Random;/** * Created by tangao on 2016/7/24. */public class RequestUtils {    private static final String UTF8 = "utf-8";    //申请者开发者id,实际使用时请修改成开发者自己的appid    private static final String APP_ID = "20160724000025690";    //申请成功后的证书token,实际使用时请修改成开发者自己的token (密钥)    private static final String SECRET_KEY = "EkqI6Mx6MPknQWuItUAA";    //翻译API HTTP地址:    private static final String baseURL = "http://api.fanyi.baidu.com/api/trans/vip/translate";    //随机数,用于生成md5值,开发者使用时请激活下边第四行代码    private static final Random random = new Random();    public RequestUtils() {    }    public void translate(final String needToTransString, final String from, final String to, final HttpCallBack callBack) throws Exception {        //用于md5加密生成签名sign        int salt = random.nextInt(10000);        // 对appId+源文+随机数+token计算md5值(签名sign),官方demo提供的下面这种计算为什么不行???//        StringBuilder md5String = new StringBuilder();//        md5String.append(APP_ID).append(needToTransString).append(salt).append(SECRET_KEY);//        String sign = DigestUtils.md5Hex(md5String.toString());        //应该对 appid+needToTransString+salt+密钥 拼接成的字符串做MD5加密得到32位小写的sign。确保要翻译的文本needToTransString为UTF-8编码。        String md5String = APP_ID + new String(needToTransString.getBytes(), "utf-8") + salt + SECRET_KEY;        final String sign = MD5Encoder.encode(md5String.toString());        //注意在生成签名拼接 appid+needToTransString+salt+密钥 字符串时,needToTransString不需要做URL encode,        // 在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段needToTransString做URL encode。        final URL urlFinal = new URL(baseURL + "?needToTransString=" + URLEncoder.encode(needToTransString, UTF8) +                "&from=" + from + "&to=" + to + "&appid=" + APP_ID + "&salt=" + salt + "&sign=" + sign);//       URLEncoder.encode(needToTransString, UTF8);//%E4%BD%A0%E5%A5%BD        //异步任务访问网络        new AsyncTask<Void, Integer, String>() {            @Override            protected String doInBackground(Void... params) {                String text = null;                HttpURLConnection conn = null;                try {                    conn = (HttpURLConnection) urlFinal.openConnection();                    conn.setRequestMethod("GET");                    //连接超时                    conn.setConnectTimeout(8000);                    InputStream is = conn.getInputStream();                    InputStreamReader isr = new InputStreamReader(is);                    BufferedReader br = new BufferedReader(isr);                    String line;                    StringBuilder builder = new StringBuilder();                    while ((line = br.readLine()) != null) {                        builder.append(line).append("\n");                    }                    //关闭输入流                    br.close();                    isr.close();                    is.close();                    // unicode                    //System.out.println("builder.toString()  ------->    " + builder.toString());                    //{"from":"zh","to":"en","trans_result":[{"src":"\u54c8\u55bd\uff0c\u4f60\u597d","dst":"Hello, hello."}]}                    JSONObject resultJson = new JSONObject(builder.toString());                    //System.out.println("resultJson.toString()  ------->    " + resultJson.toString());                    // {"from":"zh","to":"en","trans_result":[{"src":"hello,你好","dst":"Hello, hello."}]}                    /**                     * 当翻译结果无法正常返回时,可通过下面的控制台输出找到问题                     * 如果不用try/catch包裹,下面通过json解析不到text的值                     */                    try {                        String error_code = resultJson.getString("error_code");                        if (error_code != null) {                            System.out.println("出错代码:" + error_code);                            System.out.println("出错信息:" + resultJson.getString("error_msg"));                            callBack.onFailure("出错信息:" + resultJson.getString("error_msg"));                        }                    } catch (Exception e) {                        e.printStackTrace();                    }                    //获取翻译成功的结果                    JSONArray jsonArray = (JSONArray) resultJson.get("trans_result");                    JSONObject dstJson = (JSONObject) jsonArray.get(0);                    text = dstJson.getString("dst");                    text = URLDecoder.decode(text, UTF8);//utf-8译码//                    System.out.println("text  ----->   " + text);                } catch (IOException e) {                    e.printStackTrace();                } catch (JSONException e) {                    e.printStackTrace();                } finally {//若url连接异常,则断开连接                    if (conn != null) {                        conn.disconnect();                    }                }                return text;            }            @Override            protected void onPostExecute(String s) {                super.onPostExecute(s);                //翻译成功进行成功的回调                callBack.onSuccess(s);                System.out.println("onPostExecute  ---->  " + s);            }        }.execute();    }}

其中的HttpCallBack用于实现访问是否成功的回调,定义如下(新建):

public interface HttpCallBack {    void onSuccess(String result);    void onFailure(String exception);}


用于MD5加密的Md5Encoder类:

import java.security.MessageDigest;public class MD5Encoder {public static String encode(String string) throws Exception {//string.getBytes("UTF-8") 将string编码成utf-8的字节数组    byte[] hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));    StringBuilder hex = new StringBuilder(hash.length * 2);    for (byte b : hash) {        if ((b & 0xFF) < 0x10) {        hex.append("0");        }        hex.append(Integer.toHexString(b & 0xFF));    }    return hex.toString();}}

最后别忘了加网络访问权限

<uses-permission android:name="android.permission.INTERNET" />

这样,调用RequestUtils中的translate方法,便可实现翻译功能了(布局文件即最后的UI呈现在这里就省略了,大家可下载下面的Demo自己运行)!


Demo下载地址:  http://download.csdn.net/detail/highboys/9599342






1 0
原创粉丝点击