編輯:關於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(); } }
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(); } }
總體上Music App分為UI界面、服務兩個模塊,其中關於音樂文件的播放都由服務負責,服務配合AIDL使用的,界面綁定服務後可以拿到服務裡所有參數及狀態進行UI刷新。A
AndroidProgressLayout實現為界面添加圓形進度條。調用setprogress()方法顯示和隱藏進度條在Android的開發中,往往有這種需求,比如一個耗
1、json從服務端解析服務端數據客戶端的運行結果本來是這樣的[{id:1,title:"馬雲",publishTime:Sat May 14 15:
Qt qml listview下拉刷新和上拉分頁主要根據contentY來判斷。但要加上頂部下拉指示器、滾動條,並封裝成可簡單調用的組件,著實花了我不少精力:)先給大家展