37
Android WebService 建建建建建建 建建建 建建建 2012/4 V1 2012/8 V2 2013/5 V3 Android 建建建建建建建建建

Android WebService

Embed Size (px)

DESCRIPTION

Android 智慧型手機程式設計. Android WebService. 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2 2013/5 V3. 提醒 …. 這節的內容針對的是 MS 的 Web Service 或是使用 SOAP(Simple Object Access Protocol) 標準建立的 Web Service 針對其它資料庫或是 data provider ,建議可以採用 HTTPPost 或是 HttpGet. Why Web Service?. 資訊 / 功能分享 標準 (SOAP 、 XML 、 JSON) 安全 - PowerPoint PPT Presentation

Citation preview

Page 1: Android WebService

Android WebService

建國科技大學 資管系饒瑞佶

2012/4 V12012/8 V22013/5 V3

Android 智慧型手機程式設計

Page 2: Android WebService

提醒…

• 這節的內容針對的是 MS 的 Web Service 或是使用 SOAP(Simple Object Access Protocol) 標準建立的 Web Service

• 針對其它資料庫或是 data provider ,建議可以採用 HTTPPost 或是 HttpGet

Page 3: Android WebService

Why Web Service?

• 資訊 / 功能分享• 標準 (SOAP 、 XML 、 JSON)• 安全• 其他…

Page 4: Android WebService

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

Page 5: Android WebService

幾個重點• 沒有參數的 WebService

• 有參數的 WebService

• DNS 問題

Page 6: Android WebService

WebService

• 現有可以被呼叫的 WebService:–攝氏與華氏轉換

• http://www.w3schools.com/webservices/tempconvert.asmx

–取得國家• http://www.webserviceX.NET/country.asmx

Page 7: Android WebService

攝氏與華氏轉換

Page 8: Android WebService

WebService

• Step1 :建立新專案 HelloWS

• Step2 : main.xml 中建立一個輸入框 (EditText) 、兩個 TextView 與一個按鈕 (Button)

EditTextTextView

TextView

Button

Page 9: Android WebService

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; // 訊息框

Page 10: Android WebService

宣告 webservice 參數

Page 11: Android WebService

WebService

• Step5:建立物件

et_pramater =(EditText) findViewById(R.id.editText1);btn_ok =(Button) findViewById(R.id.button1);tv_msg =(TextView) findViewById(R.id.textView2);

Page 12: Android WebService

webservice 主體

相對位置

Page 13: Android WebService

WebService• Step6 :撰寫 webservice 主體public String tempconvert(String temp){ String receivedString="not work"; // 預設回傳值 try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("Celsius", temp); // 傳入溫度 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet = true; HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); SoapPrimitive Result = (SoapPrimitive)envelope.getResponse(); receivedString=Result.toString(); }catch(Exception e) { receivedString="not work"; return receivedString; } return receivedString;}

Page 14: Android WebService

呼叫 tempconvert

Page 15: Android WebService

呼叫 tempconvertbtn_ok.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) { 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); // 呼叫 WS if(value_return=="not work"){ tv_msg.setText(" 轉換失敗 "); }else{ tv_msg.setText(value_return); } } }});

Page 16: Android WebService

相對位置

Page 17: Android WebService

執行結果

Page 18: Android WebService

執行結果

Page 19: Android WebService

錯誤原因• 要開放網路存取權限 (Manifest.xml)

– <uses-permission android:name="android.permission.INTERNET"></uses-permission>

• 要設定模擬器的 DNS

• 允許使用 jar

Page 20: Android WebService

設定模擬器 DNS

Page 21: Android WebService

執行結果

Page 22: Android WebService

執行結果驗證

Page 23: Android WebService

And suggestion or improvement?

Page 24: Android WebService

My Suggestion

• 試試另一個取得國家代號的 webservice• 選用只能輸入數字的 EditText• 加入等待訊息或進度畫面• 將結果帶到下一個 Activity 做顯示• 回傳結果不只一筆,分割資料後,再用

ListActivity 做顯示• 將結果存入 SQLite• …

Page 25: Android WebService

整合 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";

Page 26: Android WebService

整合 ListView

呼叫 Web Service

ListView

Page 27: Android WebService

code

Page 28: Android WebService

code public String WScity(){ String receivedString="nok"; // 預設回傳值 try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet = true; HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); SoapPrimitive Result = (SoapPrimitive)envelope.getResponse(); receivedString=Result.toString(); }catch(Exception e) { receivedString="nok"; return receivedString; } return receivedString; }

Page 29: Android WebService

android.os.NetworkOnMainThreadException

• 在 Android 3.0 版本之後• 對網路存取增加了一些限制• 不能在 onCreate() 方法中直接使用外部連結

Page 30: Android WebService

解決方法@Overridepublic void onCreate(Bundle savedInstanceState) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); super.onCreate(savedInstanceState); ...... // 發送 Http 請求}

加入!

Page 31: Android WebService

加入!

Page 32: Android WebService

整合 Spinner

• WebService 呼叫不變

Spinner

要加一個有 Spinner 的 layout

Page 33: Android WebService

Spinner sp=(Spinner)findViewById(R.id.spinner1);

String getbackcity=WScity(); // 呼叫 WSString [] cities= getbackcity.split(","); // 利用 , 切割取得的字串變陣列// 設定利用 Spinner 顯示ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainSpinner.this,android.R.layout.simple_spinner_item,cities );

// 設定下拉選單的樣式 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); sp.setAdapter(adapter);

Page 34: Android WebService

加入等待進度畫面

Page 35: Android WebService

加入等待進度畫面

Page 36: Android WebService

private ProgressDialog MyDialog=null;

createCancelProgressDialog(" 擷取中 "," 請稍待 ..."," 取消 ");