Android調用天氣預報的WebService簡單例子 – Android移動開發技術文章_手機開發 Android移動開發教學課程

下面例子改自網上例子:http://express.ruanko.com/ruanko-express_34/technologyexchange5.html


不過網上這個例子有些沒有說明,有些情況不一樣瞭,所以我重新寫瞭。


一、獲取並使用KSOAP包


在Android SDK中並沒有提供調用WebService的庫,因此,需要使用第三方的SDK來調用WebService。PC版本的WebService庫非常豐富,但這些對Android來說過於龐大。適合手機的WebService客戶端的SDK有一些,比較常用的是KSOAP2。


KSOAP2 地址:http://code.google.com/p/ksoap2-android/


我下載的最新的是: ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar


註意:


我在使用ksoap2-android時犯瞭一個低級錯誤:使用時報錯誤:The import org.ksoap2 cannot be resolved。
當時分析這個問題時一直以為是Eclipse出瞭問題,找瞭好多方法都不行,
實際是我下載的ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar文件是錯誤的導致的,走瞭彎路。


在 http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 頁面 通過鼠標右鍵鏈接另存為存的是同名的一個純文本的Html文件。而不是我們想要的。


我是在
http://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.5.4/ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar  點 View raw file 才正確下載對應文件的。


 


 


選擇我們的項目,右鍵菜單中 Build Path –> Add External Archives… 增加這個下載的包


 


增加好後,我們在 選擇我們的項目,右鍵菜單中 Build Path –> Configure Build Path 的 Libraries 中可以看到下面圖:


 


二,分以下幾步來調用 WebService


 


1、指定 WebService 的命名空間和調用方法


import org.ksoap2.serialization.SoapObject;
private static final String NAMESPACE = “http://WebXml.com.cn/”;
private static final String METHOD_NAME = “getWeatherbyCityName”;


SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);SoapObject類的第一個參數表示WebService的命名空間,可以從WSDL文檔中找到WebService的命名空間。
第二個參數表示要調用的WebService方法名。


2、設置調用方法的參數值,如果沒有參數,可以省略,設置方法的參數值的代碼如下:


rpc.addProperty(“theCityName”, “北京”);要註意的是,addProperty方法的第1個參數雖然表示調用方法的參數名,但該參數值並不一定與服務端的WebService類中的方法參數名一致,隻要設置參數的順序一致即可。


3、生成調用Webservice方法的SOAP請求信息。


SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);創建SoapSerializationEnvelope對象時需要通過SoapSerializationEnvelope類的構造方法設置SOAP協議的版本號。
該版本號需要根據服務端WebService的版本號設置。
在創建SoapSerializationEnvelope對象後,不要忘瞭設置SOAPSoapSerializationEnvelope類的bodyOut屬性,
該屬性的值就是在第一步創建的SoapObject對象。


4、創建HttpTransportsSE對象。


這裡不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL); 這是一個要過期的類


private static String URL = “http://www.webxml.com.cn/webservices/weatherwebservice.asmx”;
HttpTransportSE ht = new HttpTransportSE(URL); ht.debug = true;5、使用call方法調用WebService方法


private static String SOAP_ACTION = “http://WebXml.com.cn/getWeatherbyCityName”;
ht.call(SOAP_ACTION, envelope);網上有人說這裡的call的第一個參數為null,但是經過我的測試,null是不行的。
第2個參數就是在第3步創建的SoapSerializationEnvelope對象。


6、獲得WebService方法的返回結果


有兩種方法:


1、使用getResponse方法獲得返回數據。


private SoapObject detail;
detail =(SoapObject) envelope.getResponse();2、使用 bodyIn 及 getProperty。


private SoapObject detail;
SoapObject result = (SoapObject)envelope.bodyIn;
detail = (SoapObject) result.getProperty(“getWeatherbyCityNameResult”);7、 這時候執行會出錯,提示沒有權限訪問網絡


需要修改 AndroidManifest.xml 文件,賦予相應權限


簡單來說就是增加下面這行配置:


完整的 AndroidManifest.xml 文件 如下:


 


註:Android 中在代碼中為瞭調試寫瞭system.out.print()輸出項


在菜單:Window–>show view–>other–>找到Android,選擇Logcat 是可以看到輸出的,
如果你想在一個單獨的窗口看到system.out.print()的輸出的話,可以在logcat界面點那個綠色的“+”好,


在Filter name 和 By log tag裡面均填入System.out,這樣的話你就能在單獨的界面查看system.out.print()的輸出瞭!!


1.0″ encoding=”utf-8″?>
http://schemas.android.com/apk/res/android”
 package=”ghj1976.MyWeather” android:versionCode=”1″
 android:versionName=”1.0″>


 @drawable/icon” android:label=”@string/app_name”>
  .MyWeatherActivity” android:label=”@string/app_name”>
   
    android.intent.action.MAIN” />
    android.intent.category.LAUNCHER” />
   
  
 
 android.permission.INTERNET”>


完整的代碼如下:


package ghj1976.MyWeather;


import java.io.UnsupportedEncodingException;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
//import org.ksoap2.transport.AndroidHttpTransport;
import org.ksoap2.transport.HttpTransportSE;


public class MyWeatherActivity extends Activity {


 private Button okButton;


 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  okButton = (Button) this.findViewById(R.id.btn_Search);
  okButton.setOnClickListener(new Button.OnClickListener() {
   @Override
   public void onClick(View v) {
      String city = “北京”;
      getWeather(city); 
   }


  });
 }


 private static final String NAMESPACE = “http://WebXml.com.cn/”;


 // WebService地址
 private static String URL = “http://www.webxml.com.cn/webservices/weatherwebservice.asmx”;


 private static final String METHOD_NAME = “getWeatherbyCityName”;


 private static String SOAP_ACTION = “http://WebXml.com.cn/getWeatherbyCityName”;


 private String weatherToday;


 private SoapObject detail;


 public void getWeather(String cityName) {
  try {
   System.out.println(“rpc——“);
   SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
   System.out.println(“rpc” + rpc);
   System.out.println(“cityName is ” + cityName);
   rpc.addProperty(“theCityName”, cityName);


   
   SoapSerializationEnvelope envelope = new SoapSerializatio

You May Also Like