Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發集成百度翻譯SDK

Android開發集成百度翻譯SDK

編輯:關於Android編程

(本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包引入項目中,運行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() {
            @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();
	}
}

最後別忘了加網絡訪問權限

 

 


這樣,調用RequestUtils中的translate方法,便可實現翻譯功能了(布局文件即最後的UI呈現在這裡就省略了,大家可下載下面的Demo自己運行)!
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved