Search code examples
androidandroid-ksoap2

Ksoap2 in Android problems


I'm trying to consume a webservice which I have in a localhost which is this one:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.1.1-b09  (branches/2.1-6834; 2011-07-16T17:14:48+0000) JAXWS-RI/2.2.5-promoted-b04 JAXWS/2.2. -->

<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.1.1-b09 (branches/2.1-6834; 2011-07-16T17:14:48+0000) JAXWS-RI/2.2.5-promoted-b04 JAXWS/2.2. -->

-<definitions name="WsParkinsonControl" targetNamespace="http://parkinsoncontrol.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://parkinsoncontrol.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
-<types>
-<xsd:schema>
<xsd:import schemaLocation="http://localhost:8080/WsParkinsonControl/WsParkinsonControl?xsd=1" namespace="http://parkinsoncontrol.com/"/>
</xsd:schema>
-<xsd:schema>
 <xsd:import schemaLocation="http://localhost:8080/WsParkinsonControl/WsParkinsonControl?xsd=2" namespace="com.parkinsoncontrol.bean"/>
 </xsd:schema>
 </types>
.............
 -<message name="logon">
 <part name="parameters" element="tns:logon"/>
 </message>

 -<message name="logonResponse">

  <part name="parameters" element="tns:logonResponse"/>

  </message>
 -<portType name="WsParkinsonControl">
 -<operation name="logon">

  <input message="tns:logon" wsam:Action="http://parkinsoncontrol.com/WsParkinsonControl/logonRequest"/>

  <output message="tns:logonResponse" wsam:Action="http://parkinsoncontrol.com/WsParkinsonControl/logonResponse"/>

  </operation>
  -<operation name="logon">

   <soap:operation soapAction=""/>

   -<input>

    <soap:body use="literal"/>

   </input>
  -<output>
  <soap:body use="literal"/>

  </output>

  </operation>

</binding>


-<service name="WsParkinsonControl">


-<port name="WsParkinsonControlPort" binding="tns:WsParkinsonControlPortBinding">

 <soap:address location="http://localhost:8080/WsParkinsonControl/WsParkinsonControl"/>

 </port>

 </service>

From this wsdl file I'm trying to consume it from an Android App which I am developing, and when I try to consume it I have the next mistake:

  06-08 22:20:21.376: E/AndroidRuntime(2703): FATAL EXCEPTION: main
  06-08 22:20:21.376: E/AndroidRuntime(2703): android.os.NetworkOnMainThreadException
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at    android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at java.net.InetAddress.getAllByName(InetAddress.java:214)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:126)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:185)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at com.example.parkinsoncontrol.MainActivity.onClick(MainActivity.java:105)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at android.view.View.performClick(View.java:4204)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at android.view.View$PerformClick.run(View.java:17355)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at android.os.Handler.handleCallback(Handler.java:725)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at android.os.Handler.dispatchMessage(Handler.java:92)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at android.os.Looper.loop(Looper.java:137)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at android.app.ActivityThread.main(ActivityThread.java:5041)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at java.lang.reflect.Method.invokeNative(Native Method)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at java.lang.reflect.Method.invoke(Method.java:511)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
  06-08 22:20:21.376: E/AndroidRuntime(2703):   at dalvik.system.NativeStart.main(Native Method)

I can see the mistake is on the line 105 from the file MainActivity which is the next fragment of code:

 ........................
  private static final String SOAP_ACTION="http://parkinsoncontrol.com/logon";
  private static final String METHOD_NAME="logon";
  private static final String NAMESPACE="http://parkinsoncontrol.com/";
  private static final String URL="http://localhost:8080/WsParkinsonControl/WsParkinsonControl?wsdl";

  public void onClick(View v) {
    // TODO Auto-generated method stub
    SoapObject request=new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo logon= new PropertyInfo();
    logon.setName("login");
    logon.setValue(txtUserName.getText().toString());
    logon.setType(String.class);
    request.addProperty(logon);
    PropertyInfo logon2= new PropertyInfo();
    logon2.setName("password");
    logon2.setValue(txtPassword.getText().toString());
    logon2.setType(String.class);
    request.addProperty(logon2);

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
     SoapObject result;
     envelope.dotNet=false;
     envelope.bodyOut=request;
     envelope.setOutputSoapObject(request);

     HttpTransportSE httpTransport = new HttpTransportSE(URL);


     try {
         httpTransport.debug=true;
        httpTransport.call(SOAP_ACTION, envelope);
        result= (SoapObject)envelope.bodyIn;
    } catch (HttpResponseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Intent i = new Intent(this,MenuActivity.class);
    startActivity(i);

}

 ..........................

The line which is the problematic one is the one which says: httpTransport.call(SOAP_ACTION, envelope); and I don't know why. Could you help me because I don't know what I'm doing wrong, please?.

Thank you in advance


Solution

  • You are doing the request in the main thread. Move it to a background thread like asyntask for example.