android webservice
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 PresentationTRANSCRIPT
Android WebService
建國科技大學 資管系饒瑞佶
2012/4 V12012/8 V22013/5 V3
Android 智慧型手機程式設計
提醒…
• 這節的內容針對的是 MS 的 Web Service 或是使用 SOAP(Simple Object Access Protocol) 標準建立的 Web Service
• 針對其它資料庫或是 data provider ,建議可以採用 HTTPPost 或是 HttpGet
Why Web Service?
• 資訊 / 功能分享• 標準 (SOAP 、 XML 、 JSON)• 安全• 其他…
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:建立物件
et_pramater =(EditText) findViewById(R.id.editText1);btn_ok =(Button) findViewById(R.id.button1);tv_msg =(TextView) findViewById(R.id.textView2);
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;}
呼叫 tempconvert
呼叫 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); } } }});
相對位置
執行結果
執行結果
錯誤原因• 要開放網路存取權限 (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
code
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; }
android.os.NetworkOnMainThreadException
• 在 Android 3.0 版本之後• 對網路存取增加了一些限制• 不能在 onCreate() 方法中直接使用外部連結
解決方法@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 請求}
加入!
加入!
整合 Spinner
• WebService 呼叫不變
Spinner
要加一個有 Spinner 的 layout
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);
加入等待進度畫面
加入等待進度畫面
private ProgressDialog MyDialog=null;
createCancelProgressDialog(" 擷取中 "," 請稍待 ..."," 取消 ");
有沒有興趣看看HTTPPost 與 HTTPGet ?
http://seanstar5317.pixnet.net/blog/post/28092031-%5Bandroid%5D%E5%BE%9Emysql-%E6%8A%93%E8%B3%87%E6%96%99%EF%BC%8C%E5%8B%95%E6%85%8B%E6%96%B0%E5%A2%9Etextview%E8%87%B3tablela