Invoke webservices from Android

This is ongoing blog on Getting Started with Android. In earlier blog, I provided an architecture overview of android application, followed by setting up the development environment for Android and creating and running a simple application.

In this blog, I would describe how to invoke web services (soap based services) via Android. In my next blog, I would follow it up with how to invoke REST based services. For trying out the tutorial, you need to have the android development environment setup as mentioned in my previous blog.

There are two ways in which invoke web services

  • Raw APIs  : Use the HttpClient and XML parser to manually create a soap request and parse the soap response.

I would start development with the later approach, but I plan to use RAW APIs in the follow up post -

Download the KSOAP2 library , go to http://code.google.com/p/ksoap2-android/ , click on downloads link on the menu, and download the latest release artifact – http://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.5.2/ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar . In the release artifact page, click on “View raw file” and select “Save Link as” and download the jar file which has all the required dependencies.

Next we would create a sample android project which would invoke a .NET web service. I decided to host a simple .NET web service in my website , so it would easier for you all to try out the sample . The web service is available at http://naveenbalani.com/WassupAndroid.asmx

This is a simple .NET service, with one operation called todayMessage(), which display “Wassup Android from a .NET application “ as output.

To create an andrioid project.  Start eclipse.

  • Select File > New > Project.
  • Select Android > Android Project, Click Next.
  • Enter the following information for the project -

Project name –  AndroidClientService

Build Target – Android 2.3

Application name –  WasuppTodaysMessage

Package name – org.android.websevice.client.samples

Create Activity –  AndroidClientService

Min SDK Version –  9

  • Click Finish

This would create a Project called AndroidClientService in your workspace.

Next , add the ksoap2-andriod dependency to the project. Select the AndroidClientService, click properties , click on Java build path , click on Libraries , select Add External Jars and add the ksoap2 library (ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar) and click Ok.

Next, open up the WasuppServiceClientAndroid class and replace the onCreate method with the following onCreate() method as shown in listing below. Following shows the complete code listing.

This project would invoke the web service and display – “ “  on the device when the application is executed. To build the project, select Project -> Clean

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());

}

}
}

To run the AndroidClientService  Android application, click on it and select Run As > Android Application.

On the eclipse console, you would see the following similar message –

[AndroidClientService] Performing android.websevice.client.samples.AndroidClientService activity launch

[AndroidClientService] Automatic Target Mode: launching new emulator with compatible AVD ‘AVD’

[AndroidClientService] Launching a new emulator with Virtual Device ‘AVD’

[AndroidClientService] Waiting for HOME (‘android.process.acore’) to be launched…

You should see the Android AVD being launched. After the above message, it takes a while (2-3 minutes) for the first time to get the Android home page on the emulator.

After the device is started, you should see the following message on console..

[AndroidClientService] Uploading AndroidClientService.apk onto device ‘emulator-5554′

[AndroidClientService] Installing AndroidClientService.apk…

[AndroidClientService] Success!

[AndroidClientService] Starting activity android.websevice.client.samples.AndroidClientService on device emulator-5554

If the application doesn’t show up on the emulator, Click on Menu option on the emulator and you would see the WasuppTodayMessage android application and message being displayed.

Issues encountered during invoking the web services application from Android Emulator

  • Unknown host exception  –

If you get the following exception – “java.net.UnKnownHostException: naveenbalani.com’, than you need to add required domain name server which emulator would use to resolve domain.

A list of network limitations on emulator is available at – http://developer.android.com/guide/developing/tools/emulator.html#networkinglimitations

As per the documentation – “

“At startup, the emulator reads the list of DNS servers that your system is currently using. It then stores the IP addresses of up to four servers on this
list and sets up aliases to them on the emulated addresses 10.0.2.3, 10.0.2.4, 10.0.2.5 and 10.0.2.6 as needed.

On Linux and OS X, the emulator obtains the DNS server addresses by parsing the file /etc/resolv.conf. On Windows, the emulator obtains the addresses by calling the GetNetworkParams() API. Note that this usually means that the emulator ignores the content of your “hosts file”

Now, to add the domain name server, click on Run configurations and select AndroidClientService and add the following

-dns-server ns15.unitechost.in

in the additional emulator command line options as shown below. Click Run to run the configuration

  • Security

If you get a permission issue while accessing internet, you need to add the following line in <uses-permission android:name=”android.permission.INTERNET”></uses-permission> to allow application to access  internet

Here is the  complete listing of 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>


Warning: require_once(/home/naveefjs/public_html/wp-content/themes/nb/footer.php) [function.require-once]: failed to open stream: Permission denied in /home/naveefjs/public_html/wp-includes/template.php on line 501

Fatal error: require_once() [function.require]: Failed opening required '/home/naveefjs/public_html/wp-content/themes/nb/footer.php' (include_path='.:/usr/local/altphp/lib/php') in /home/naveefjs/public_html/wp-includes/template.php on line 501