Хорошо, у вас есть функция FReadStatus:
<message name="FReadStatus">
<part name="parameters" element="tns:FReadStatus"/>
</message>
, который имеет элемент FReadStatus сложного типа (т.е. объект, который является классом, найденным на сервере) .
Этот сложный тип имеет атрибут arg0 типа String. Его определение:
<xs:complexType name="FReadStatus">
<xs:sequence>
<xs:element name="arg0" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
Таким образом, вам нужно будет создать локальный класс, который реализует kvmSerializable для сопоставления этого сложного типа с соответствующим классом на сервере, поэтому вы будете делать:
public class FReadStatus implements KvmSerializable {
String mac;
@Override
public Object getProperty(int arg0) {
switch (arg0){
case 0:
return mac;
default:
return null;
}
}
@Override
public int getPropertyCount() {
return 1;//because you have 1 parameter
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch(arg0)
{
case 0:
arg2.type = PropertyInfo.STRING_CLASS;//because its type is string
arg2.name = "arg0";
break;
default:break;
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch(arg0)
{
case 0:
mac= (String)arg1;
break;
default:
break;
}
}
Теперь, когда у вас есть класс, вы сделаете следующее в коде, который у вас был:
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo pi = new PropertyInfo();
pi.setName("arg0");
pi.setValue("000D6F0000");
pi.setType(FReadStatus .class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
//Now you have to add mapping to map the local class created, to the one on the server
envelope.addMapping(NAMESPACE , FReadStatus.class.getSimpleName(), FReadStatus .class);
// Add marshalling (this one might not be necessary, but ill just add it)
Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(envelope);
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);//AndroidHttpTransport INSTEAD OF HttpTransportSE
androidHttpTransport.debug = true;//NEW ADDED
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
//Important Outputs to check how the request/Response looks like.. Check them in Logcat to find these outputs
System.out.println("requestDump is :"+androidHttpTransport.requestDump);
System.out.println("responseDump is :"+androidHttpTransport.responseDump);
System.out.println("response"+envelope.getResponse());
} catch (Exception e){}
Дайте мне знать, что происходит. Вы должны использовать Logcat для проверки requestDump и responseDump
ОБНОВЛЕНИЕ: ответ на ваш вопрос о UnknowHostException
возможные причины и решения
Проверьте, есть ли в вашем AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Если вы используете эмулятор, сделайте, как указано в этой ссылке
Если вы используете прокси-сервер, выполните:
System.setProperty("http.proxyHost", "my.proxyhost.com");
System.setProperty("http.proxyPort", "1234");
Возможно, вам придется использовать прогрев днс, проверьте эту ссылку