經濟部工業局 Android 智慧型手機程式設計實務應用班 Android WebService 建國科技大學資管系 饒瑞佶 2012/4
WebService 需要 ksoap2-android-assembly-2.5.2-jar-withdependencies.jar 或 ksoap2-android-assembly-2.5.2-jar-withdependencies_timeout1.jar Project Properties Java Build Path Libraries Add External JARs 需要設定 DNS 才可以連結有 Domain Name 的 WebService dns 解決方法 adb shell #getprop 查看 DNS 設定 [net.dns1]: [192.168.2.1] net.dns1 就是目前的設定 setprop net.dns1 168.95.1.1 設定成可以用的 DNS
幾個重點 沒有參數的 WebService 有參數的 WebService DNS 問題
WebService 現有可以被呼叫的 WebService: 攝氏與華氏轉換 http://www.w3schools.com/webservices/te mpconvert.asmx 取得國家 http://www.webservicex.net/country.asmx
攝氏與華氏轉換
WebService Step1: 建立新專案 HelloWS Step2:main.xml 中建立一個輸入框 (EditText) 兩個 TextView 與一個按鈕 (Button) TextView EditText TextView Button
WebService Step3: 加入 ksoap2 這個外部 jar Step4: 宣告 webservice 參數 // 有參數值的 Web Service --- 攝氏與華氏轉換 (AVD 無法解析 domain name) private static final String NAMESPACE = "http://tempuri.org/" ; private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx"; private static final String METHOD_NAME = "CelsiusToFahrenheit"; private static final String SOAP_ACTION = "http://tempuri.org/celsiustofahrenheit"; private EditText et_pramater; // 輸入框 private Button btn_ok; // 按鈕 private TextView tv_msg; // 訊息框
宣告 webservice 參數
Step5: 建立物件 WebService
webservice 主體 相對位置
WebService Step6: 撰寫 webservice 主體 // webservice public String tempconvert(string aa){ String receivedstring1="nok"; // 預設回傳值 try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addproperty("celsius", aa); // 傳入帳號 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setoutputsoapobject(request); envelope.dotnet = true; HttpTransportSE androidhttptransport = new HttpTransportSE(URL,TimeOut); androidhttptransport.call(soap_action, envelope); SoapPrimitive Result = (SoapPrimitive)envelope.getResponse(); receivedstring1=result.tostring(); }catch(exception e) { receivedstring1="nok"; return receivedstring1; } return receivedstring1; } //---------------------------tempconvert--------------------------
呼叫 tempconvert
呼叫 tempconvert @Override public void onclick(view v) { // TODO Auto-generated method stub String to_be_transfered; to_be_transfered=et_pramater.gettext().tostring(); String value_return; if(to_be_transfered==null "".equals(to_be_transfered)){ tv_msg.settext(" 您沒有輸入轉換值 "); et_pramater.setfocusable(true); }else{ value_return=tempconvert(to_be_transfered); if(value_return=="nok"){ tv_msg.settext(" 轉換失敗 "); }else{ tv_msg.settext(value_return); } } }
相對位置
執行結果
執行結果
錯誤原因 要開放網路存取權限 (Manifest.xml) <uses-permission android:name="android.permission.internet"></ uses-permission> 要設定模擬器的 DNS 允許使用 jar
設定模擬器 DNS
執行結果
執行結果驗證
And suggestion or improvement?
My Suggestion 試試另一個取得國家代號的 webservice 選用只能輸入數字的 EditText 加入等待訊息或進度畫面 將結果帶到下一個 Activity 做顯示 回傳結果不只一筆, 分割資料後, 再用 ListActivity 做顯示 將結果存入 SQLite
整合 ListView 無參數 回傳一組以, 為分隔符號的結果 private static final String NAMESPACE = "http://tempuri.org/" ; private static final String URL = "http://211.20.52.86/map_ap_1/city.asmx"; private static final String METHOD_NAME = "city"; private static final String SOAP_ACTION = "http://tempuri.org/city";
整合 ListView 呼叫 Web Service ListView
整合 Spinner WebService 呼叫不變 要加一個有 Spinner 的 layout Spinner
Spinner sp=(spinner)findviewbyid(r.id.spinner1); // 建立一個 ArrayAdapter 物件, 並放置下拉選單的內容 ArrayAdapter<String> adapter = new ArrayAdapter<String>( WS_Spinner.this,android.R.layout.simple_spinner_item, cities ); // 設定下拉選單的樣式 adapter.setdropdownviewresource(android.r.layout.simple_spinner_dropdown_item); sp.setadapter(adapter);
加入等待進度畫面
加入等待進度畫面
private void createcancelprogressdialog(string title, String message, String buttontext) { MyDialog = new ProgressDialog(this); MyDialog.setTitle(title); MyDialog.setMessage(message); MyDialog.setButton(buttonText, new DialogInterface.OnClickListener(){ public void onclick(dialoginterface dialog, int which){ // Use either finish() or return() to either close the activity or just the dialog MyDialog.dismiss(); return; } }); MyDialog.show(); }