zoukankan      html  css  js  c++  java
  • Android调用天气预报的WebService简单例子

    转自:http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html

    下面例子改自网上例子: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 才正确下载对应文件的。

    image

    选择我们的项目,右键菜单中 Build Path –> Add External Archives… 增加这个下载的包

    image

    增加好后,我们在 选择我们的项目,右键菜单中 Build Path –> Configure Build Path 的 Libraries 中可以看到下面图:

    image

    二,分以下几步来调用 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 文件,赋予相应权限

    简单来说就是增加下面这行配置:<uses-permission android:name="android.permission.INTERNET"></uses-permission>

    完整的 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()的输出了!!

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    	package="ghj1976.MyWeather" android:versionCode="1"
    	android:versionName="1.0">
    
    	<application android:icon="@drawable/icon" android:label="@string/app_name">
    		<activity android:name=".MyWeatherActivity" android:label="@string/app_name">
    			<intent-filter>
    				<action android:name="android.intent.action.MAIN" />
    				<category android:name="android.intent.category.LAUNCHER" />
    			</intent-filter>
    		</activity>
    	</application>
    	<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    
    </manifest>

    完整的代码如下:

    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 SoapSerializationEnvelope(SoapEnvelope.VER11);
    			envelope.bodyOut = rpc;
    			envelope.dotNet = true;
    			envelope.setOutputSoapObject(rpc);
    			
    			HttpTransportSE ht = new HttpTransportSE(URL);
    
    			//AndroidHttpTransport ht = new AndroidHttpTransport(URL);
    			ht.debug = true;
    
    			ht.call(SOAP_ACTION, envelope);
    			//ht.call(null, envelope);
    
    			//SoapObject result = (SoapObject)envelope.bodyIn;
    			//detail = (SoapObject) result.getProperty("getWeatherbyCityNameResult");
    
    			detail =(SoapObject) envelope.getResponse();
    			
    			//System.out.println("result" + result);
    			System.out.println("detail" + detail);
    			Toast.makeText(this, detail.toString(), Toast.LENGTH_LONG).show();
    			parseWeather(detail);
    
    			return;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	private void parseWeather(SoapObject detail)
    			throws UnsupportedEncodingException {
    		String date = detail.getProperty(6).toString();
    		weatherToday = "今天:" + date.split("")[0];
    		weatherToday = weatherToday + "\n天气:" + date.split("")[1];
    		weatherToday = weatherToday + "\n气温:"
    				+ detail.getProperty(5).toString();
    		weatherToday = weatherToday + "\n风力:"
    				+ detail.getProperty(7).toString() + "\n";
    		System.out.println("weatherToday is " + weatherToday);
    		Toast.makeText(this, weatherToday, Toast.LENGTH_LONG).show();
    
    	}
    }

    参考资料

    在Android中访问WebService接口
    http://www.cnblogs.com/yy-7years/archive/2011/01/24/1943286.html

    Android调用WebService
    http://express.ruanko.com/ruanko-express_34/technologyexchange5.html

    中国气象局的WebService地址
    http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

    Android与服务器端数据交互(基于SOAP协议整合android+webservice)
    http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html

  • 相关阅读:
    Zend Framework 2.1.5 中根据服务器的环境配置调用数据库等的不同配置
    在基于 Eclipse 的 IDE 中安装和使用 Emmet(ZenCoding)
    【翻译】Emmet(Zen Coding)官方文档 之六 自定义 Emmet
    【翻译】Emmet(Zen Coding)官方文档 之二 缩写
    【翻译】Emmet(Zen Coding)官方文档 之七 一览表
    【翻译】Emmet(Zen Coding)官方文档 之三 CSS 缩写
    【翻译】Emmet(Zen Coding)官方文档 之四 动作
    【翻译】Emmet(Zen Coding)官方文档 之一 web 编程的必备工具
    Zend Framework 2 时区设置警告问题的解决
    【翻译】Emmet (Zen Coding) 元素类型
  • 原文地址:https://www.cnblogs.com/qingblog/p/2563902.html
Copyright © 2011-2022 走看看