这是一篇关于开始使用 Android的持续博客。在早期博客中,提供了 Android 应用的架构概述,随后设置了 Android 开发环境并创建和运行了一个简单的应用。
在本博客中,将描述如何通过 Android 调用 Web 服务(基于 SOAP 的服务),下一篇博客将介绍如何调用基于 REST 的服务。尝试本教程需要按照之前博客[http://naveenbalani.com/index...]中所述设置 Android 开发环境。
调用 Web 服务有两种方式:
- 原始 API:使用 HttpClient 和 XML 解析器手动创建 SOAP 请求并解析 SOAP 响应。
- 使用 SOAP 客户端库:如 KSOAP 库,它负责解析和处理 SOAP 消息的底层工作 - 对于 Android,可在[http://code.google.com/p/ksoa...]获取库。看到 KSOAP 2 的活跃开发很不错,记得 2003 年就写过关于 KSOAP 2 的第一篇文章[http://naveenbalani.com/index...],很高兴它又在为 Android 开发。
将从后一种方法开始开发,但计划在后续帖子中使用原始 API。
下载 KSOAP2 库,前往[http://code.google.com/p/ksoa...],点击菜单上的下载链接,下载最新版本的工件 - [http://code.google.com/p/ksoa...]。在发布工件页面,点击“查看原始文件”并选择“另存为”下载包含所有必需依赖项的 jar 文件。
接下来创建一个示例 Android 项目,该项目将调用.NET Web 服务。在网站中托管一个简单的.NET Web 服务,服务地址为[http://naveenbalani.com/Wassu...]。
创建 Android 项目步骤:
- 启动 eclipse。
- 选择“文件>新建>项目”。
- 选择“Android>Android 项目”,点击“下一步”。
为项目输入以下信息:
- 项目名称 - AndroidClientService
- 构建目标 - Android 2.3
- 应用名称 - WasuppTodaysMessage
- 包名称 - org.android.websevice.client.samples
- 创建活动 - AndroidClientService
- 最小 SDK 版本 - 9
- 点击“完成”。
为项目添加 ksoap2-andriod 依赖:选择 AndroidClientService,点击“属性”,点击“Java 构建路径”,点击“库”,选择“添加外部 JAR”并添加 ksoap2 库(ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar),然后点击“确定”。
打开 WasuppServiceClientAndroid 类,将 onCreate 方法替换为以下代码:
package android.websevice.client.samples;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class AndroidClientService extends Activity {
private static final String SOAP_ACTION = "http://www.naveenbalani.com/webservices/WassupAndroidService/todaysMessage";
private static final String OPERATION_NAME = "todaysMessage";
private static final String WSDL_TARGET_NAMESPACE = "http://www.naveenbalani.com/webservices/WassupAndroidService/";
private static final String SOAP_ADDRESS = "http://naveenbalani.com/WassupAndroid.asmx";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
setContentView(textView);
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
try {
httpTransport.call(SOAP_ACTION, envelope);
Object response = envelope.getResponse();
textView.setText(response.toString());
} catch (Exception exception) {
textView.setText(exception.toString());
}
}
}
运行 AndroidClientService Android 应用:点击它并选择“运行作为>Android 应用”。
在 eclipse 控制台中,会看到类似以下消息:
[AndroidClientService] 执行 android.websevice.client.samples.AndroidClientService 活动启动
[AndroidClientService] 自动目标模式:启动具有兼容 AVD‘AVD’的新模拟器
[AndroidClientService] 启动具有虚拟设备‘AVD’的新模拟器
[AndroidClientService] 等待 HOME(‘android.process.acore’)启动…
应看到 Android AVD 启动。上述消息后,首次在模拟器上获取 Android 主页需要一些时间(2 - 3 分钟)。
设备启动后,在控制台上应看到以下消息:
[AndroidClientService] 将 AndroidClientService.apk 上传到设备‘emulator-5554’
[AndroidClientService] 安装 AndroidClientService.apk…
[AndroidClientService] 成功!
[AndroidClientService] 在设备 emulator-5554 上启动活动 android.websevice.client.samples.AndroidClientService
如果应用未在模拟器上显示,点击模拟器上的“菜单”选项,应看到 WasuppTodayMessage Android 应用和显示的消息。
在 Android 模拟器中调用 Web 服务应用时遇到的问题:
- 未知主机异常:如果得到“java.net.UnKnownHostException: naveenbalani.com”异常,需要添加模拟器将使用的必需域名服务器以解析域名。关于模拟器的网络限制列表可在[http://developer.android.com/...]获取。根据文档,启动时模拟器会读取系统当前使用的 DNS 服务器列表,然后在需要时在模拟地址 10.0.2.3、10.0.2.4、10.0.2.5 和 10.0.2.6 上设置别名。在 Linux 和 OS X 上,模拟器通过解析 /etc/resolv.conf 文件获取 DNS 服务器地址。在 Windows 上,模拟器通过调用 GetNetworkParams()API 获取地址。注意,这通常意味着模拟器忽略“hosts 文件”的内容。要添加域名服务器,点击“运行配置”并选择 AndroidClientService,在附加模拟器命令行选项中添加“-dns-server ns15.unitechost.in”,然后点击“运行”以运行配置。
- 安全问题:如果在访问互联网时遇到权限问题,需要在<uses-permission android:name="android.permission.INTERNET"></uses-permission>中添加以下行以允许应用访问互联网。以下是完整的 AndroidManifest.xml 清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.websevice.client.samples" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AndroidClientService" 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-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。