1. 程式人生 > >百度線上翻譯

百度線上翻譯

第一步、註冊後開發者許可權獲取APPID和金鑰

該介面申請引數如下



第二步、獲取使用者輸入的需要翻譯的內容並轉換成介面可以識別的形式

private void dealWithField() {
        String str = edit_query.getText().toString();
        if (str != null && str.length() > 0) {
            q = str;
        }
        q = Utils.toUtf8(q);
        String l = appid + q + salt + key;
        sign = Utils.encrypt(l);

        q = Utils.toURLDecoded(q);
        en = Utils.toURLDecoded(en);
        zh = Utils.toURLDecoded(zh);
    }
Utils類具體處理方法:
public class Utils {

    public static String toURLDecoded(String paramString) {
        if (paramString == null || paramString.equals("")) {
            return "";
        }

        try {
            String str = new String(paramString.getBytes(), "UTF-8");
            str = URLDecoder.decode(str, "UTF-8");
            return str;
        } catch (Exception localException) {
        }
        return "";
    }

    public static String toUtf8(String str) {
        String result = null;
        try {
            result = new String(str.getBytes("UTF-8"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }


    /**
     * 加密
     * @param plaintext 明文
     * @return ciphertext 密文
     */
    public final static String  encrypt(String plaintext) {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            byte[] btInput = plaintext.getBytes();
            // 獲得MD5摘要演算法的 MessageDigest 物件
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的位元組更新摘要
            mdInst.update(btInput);
            // 獲得密文
            byte[] md = mdInst.digest();
            // 把密文轉換成十六進位制的字串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }

}

第三步、開始識別
     OkHttpUtils
                        .get()
                        .url("http://api.fanyi.baidu.com/api/trans/vip/translate")
                        .addParams("q", q)
                        .addParams("from", en)
                        .addParams("to", zh)
                        .addParams("appid", appid)
                        .addParams("salt", salt)
                        .addParams("sign", sign)
                        .build()
                        .execute(new TransCallBack() {
                            @Override
                            public void onError(Call call, Exception e, int id) {
                                Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onResponse(TransResult response, int id) {
                                tv_result.setText(response.getTrans_result().get(0).getDst());
                            }
                        });
網路用的是鴻洋封裝的OKhttp工具庫,解析用的fastjson
compile 'com.zhy:okhttputils:2.6.2'
compile 'com.alibaba:fastjson:1.2.34'

結果回撥介面
public abstract class TransCallBack extends Callback<TransResult> {
    @Override
    public TransResult parseNetworkResponse(Response response, int id) throws Exception {
        String s = response.body().string();
        TransResult result = JSON.parseObject(s, TransResult.class);
        return result;
    }
}

注意百度翻譯返回的結果是一個list集合,json如下
{"from":"en","to":"zh","trans_result":[{"src":"apple","dst":"\u82f9\u679c"}]}

json的對應實體類:
public class TransResult {

    /**
     * from : en
     * to : zh
     * trans_result : [{"src":"apple","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 : apple
         * 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;
        }
    }
}


說到json實體類,Android studio有一個非常便捷的實體類生成外掛“GsonFormat”

下載安裝,重啟as,然後新建一個Javabean類


使用Alt+Insert或者Alt+s快捷鍵,將返回的json內容完整的貼上進去



點選OK生成一個完好的Javabean類

注意fastjson對格式要求很高,出現了不符合標準的屬性名可用以下方法轉化

@JSONField(name = "total_join_user")
private int userCount;