android webservice
DESCRIPTION
經濟部工業局 Android 智慧型手機程式設計實務應用班. Android WebService. 建國科技大學 資管系 饒瑞佶 2012/4. WebService. 需要 ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 或 ksoap2-android-assembly-2.5.2-jar-with-dependencies_timeout1.jar Project Properties Java Build PathLibraries Add External JARs - PowerPoint PPT PresentationTRANSCRIPT
Android WebService
建國科技大學 資管系饒瑞佶2012/4
經濟部工業局Android 智慧型手機程式設計實務應用班
WebService• 需要 ksoap2-android-assembly-2.5.2-jar-with-
dependencies.jar 或 ksoap2-android-assembly-2.5.2-jar-with-dependencies_timeout1.jar– ProjectPropertiesJava Build PathLibraries Add
External JARs
• 需要設定 DNS 才可以連結有 Domain Name 的 WebServicedns 解決方法– 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/tempconvert.asmx
–取得國家• http://www.webserviceX.NET/country.asmx
攝氏與華氏轉換
WebService• Step1 :建立新專案 HelloWS• Step2 : main.xml 中建立一個輸入框
(EditText) 、兩個 TextView 與一個按鈕 (Button)
EditTextTextView
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 參數
WebService
• Step5 :建立物件
webservice 主體
相對位置
WebService
• Step6 :撰寫 webservice 主體// webservicepublic 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@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString 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
要加一個有 Spinner 的 layout
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();}