- 浏览: 880203 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hzw2312:
C = sin(MLatA)*sin(MLatB)*cos(M ...
根据地球上任意两点的经纬度计算两点间的距离 -
zhang_sun:
rewind方法的limit又是多少呢?等于capacity? ...
ByteBuffer的flip,clear及rewind区别 -
kalogen:
一种每次都获取到不同的随机数的办法int ranseed=12 ...
J2ME中Random类的使用 -
kalogen:
估计部署在某个端口下吧,仔细检查一下发布的配置文件
Tomcat负载均衡和集群环境的搭建 -
zhuchao_ko:
文件大点就嗝屁了~~~
Axis 1.4 上传二进制文件(base64Binary)
下面例子改自网上例子: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 文件,赋予相应权限
简单来说就是增加下面这行配置:<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
发表评论
-
Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
2013-08-02 15:27 676Installation error: INSTALL_PA ... -
解决ADB server didn't ACK问题
2013-08-01 16:06 1002之前运行eclipse执行android应用都没问题,今天突然 ... -
Android应用签名
2013-01-08 15:05 1361为了要签名? 开发Android的人这么多,完全 ... -
Android中图片与屏幕密度 .
2012-10-10 14:19 859在drawable中的图片在不同密度的设备上显示时,在屏幕上的 ... -
在电脑上安装Android模拟器-部分更新详解
2012-10-09 17:03 1376本文根据如下的模拟器 ... -
android 反射机制中 getMethod()和getDeclaredField()区别
2012-09-15 11:33 10390今天在程序中用到java反 ... -
android2.2 的cookie
2012-08-29 19:22 920public static void getCookies(H ... -
把第三方的jar打包到android的apk文件中
2012-08-23 16:34 2410在android项目中新建一个文件夹libs,必须用这个,不能 ... -
android 正则表达式
2012-08-21 15:58 1297只能输入数字:"^[0-9]*$"。只能输 ... -
用反射功能找不到匹配的类的时候调试方法
2012-08-19 14:17 3556可以通过输出所有的methods 或者declaredMeth ... -
android 生命周期研究资料
2012-08-06 16:46 1092引言 应用程序组件有一个生命周期——一开始Android ... -
Android-----WebView使用
2012-08-01 20:06 1034大部分内容为网上整理其它高人的帖子,现只作整理,用于查看: ... -
Android开发_如何调用系统默认浏览器访问
2012-08-01 19:31 1017一、启动android默认浏览 ... -
Android代码混淆的实践
2012-07-20 12:48 873发apk的时候当然要考虑保护好自己的代码,Android环境就 ... -
Android 获取文件目录以及文件的删除 .
2012-07-14 22:24 1370//看来看一下效果 //main.xml文件 & ... -
Android Intent的几种用法全面总结
2012-07-14 14:21 886Intent应该算是Android中特有的东西。你可以 ... -
最简单的获取未安装APK文件图标、包名的方法
2012-07-13 17:14 1485package lab.sodino.fetchapkicon ... -
Android获取未安装或已安装apk的版本、图标等资源 .
2012-07-12 23:06 1510在上篇博文中介绍了Android动态加载APK--代码安装、获 ... -
Android 动态加载APK--代码安装、获取资源及Intent调用已安装apk .
2012-07-12 23:05 7111最近在研究Android动态加载APK技术,偶有小得,共享一下 ... -
android系统中 从一个apk启动另外一个apk
2012-07-12 21:24 1573Intent mIntent = new Intent(“an ...
相关推荐
本实例将深入探讨Android中如何使用Webservice,特别是针对天气预报服务的调用。我们将关注以下几个核心知识点: 1. **Web Service基础**:Web Service是一种基于互联网的、标准化的、能够跨平台进行通信的软件服务...
在Android开发中,调用外部Web服务,如天气预报API,是常见的功能需求。本教程将专注于如何在Android应用中实现这一功能,特别是在这个名为"WeatherSearch"的项目中。我们将探讨以下几个关键知识点: 1. **Android...
【Android天气预报Webservice应用程序】 在移动应用开发中,Android平台提供了一个强大的框架来构建功能丰富的应用程序。本项目“android天气预报之Webservice应用程序”是一个典型的示例,它展示了如何利用Android...
在这个“android 天气预报实例”中,我们将深入探讨如何利用Android SDK调用WebService接口来获取并显示天气预报信息。 首先,我们要了解的是Android中的网络编程。在Android系统中,网络操作通常在后台线程执行,...
【Android与WebService天气预报Demo详解】 在移动应用开发中,实时获取天气信息是常见的功能之一。本Demo结合了Android客户端和WebService技术,为用户展示如何从远程服务器获取并展示天气预报数据。通过这个实例,...
本实例"android天气预报Demo"就是这样一个完整的实践项目,通过集成Webservice接口来获取全国范围内的天气信息,并在Android设备上进行展示。 首先,我们要了解如何使用Webservice。在本例中,开发者可能使用了HTTP...
在Android开发中,调用Web Service是常见的数据交互方式,特别是在获取远程服务器上的实时信息,如天气预报时。本文将详细讲解如何在Android应用中利用Webservice获取天气数据,并以"android下访问webservice服务...
通过一个登录的案例,重点演示了android如何调用服务端的webservice,都采用了apache的框架, 服务端接口的返回数据使用了压缩加密的技术,10K的数据在压缩加密之后变成1K,这是手机省流量的关键技术所在,android...
在Android开发中,调用Web ...总之,Android调用Web Service获取天气预报涉及网络通信、数据解析、异常处理、UI设计等多个方面,通过合理的技术选型和规范的编程实践,可以构建出高效、稳定且用户体验良好的应用。
### Android调用.NET WebService详解 #### 一、概述 在Android开发中,与服务器进行交互是必不可少的一个环节。常见的交互方式包括HTTP请求、RESTful API等,而WebService作为一种传统但依然广泛使用的通信协议,...
使用ksoap2调用Webservice实例 需将lib文件夹设置为源文件夹 在AndroidManifest.xml文件中加入<uses-permission android:name="android.permission.INTERNET" />
Android调用WebService的例子(包括服务器端和客户端)。服务器端使用CXF框架发布,Android客户端使用KSOAP2包读取数据。 分别提供了JavaBean、XML、JSON数据类型的通信方式。
以下是一个简单的调用Webservice的例子: ```java SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("param1", value1); request.addProperty("param2", value2); ...
Android通过webservice连接SqlServer实例(Android4.0可运行)从原博http://blog.csdn.net/zhyl8157121/article/details/8169172下载下来的demo,看了评论和其它文章后修改,解决了Android2.3以上StrictMode模式下不...
**二、Android调用Web Service的步骤** 1. **构建服务端:** - 使用Java(J2EE)编写Web Service接口和实现,比如使用Java的JAX-WS(Java API for XML Web Services)。 - 配置并部署服务到Web服务器,如Tomcat,...
1. 调用WebService:使用Android的网络API(如HttpURLConnection)或者Retrofit等库,构造请求URL,携带必要的参数(如SQL查询语句),向服务器发送请求。 2. 数据解析:收到服务器返回的XML或JSON响应后,使用如DOM...
【标题】:“webService调用实例 Demo” 在IT行业中,Web Service是一种常见的应用程序接口(API)形式,它允许不同系统间的交互,无论它们是用何种编程语言或运行在何种操作系统上。本“webService调用实例 Demo”...
2. **Android调用Web服务** - **HTTP请求库**:Android客户端需要一个库来发送HTTP请求并解析响应。常见的库有HttpURLConnection(内置)、Volley、OkHttp和Retrofit等。这里我们以Retrofit为例,它是一个强大的...