У меня есть метод, который должен отправить объект типа «Solicitud» в веб-сервис, проблема в том, что когда я пытаюсь отправить объект в сеть, что-то получает нулевое значение. Это моя трассировка стека исключений:
W/System.err: java.lang.IllegalArgumentException: is == null
W/System.err: at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1636)
at org.ksoap2.transport.Transport.parseResponse(Transport.java:128)
W/System.err: at org.ksoap2.transport.HttpTransportSE.parseResponse(HttpTransportSE.java:301)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:274)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
W/System.err: at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
W/System.err: at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity.insertSOAP(ServiciosActivity.java:202)
at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity.armarSolicitud(ServiciosActivity.java:174)
W/System.err: at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity.access$300(ServiciosActivity.java:59)
at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity$7.onClick(ServiciosActivity.java:327)
W/System.err: at androidx.appcompat.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err: at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6702)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)
D/View: [Warning] assignParent to null: this = DecorView@4b62fd9[ServiciosActivity]
D/Surface: Surface::disconnect(this=0x74ae39a000,api=2)
Класс моей модели:
package com.sfr.sfrmovil.Activities.Modelo;
import androidx.annotation.Keep;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
import java.util.Hashtable;
@Keep
public class Solicitud implements KvmSerializable {
private static final String ID_SERVICIO = "idservicio";
private static final String ID_FUENTE = "idfuente";
private static final String ID_NOMBRES = "nombres";
private static final String TELEFONO = "telefono";
private static final String EMAIL = "email";
private static final String DETALLE = "detalle";
private static final String LATITUD = "latitud";
private static final String LONGITUD = "longitud";
private static final String IMAGEN = "imagen";
private int idservicio;
private int idfuente;
private String nombres;
private String telefono;
private String email;
private String detalle;
private float latitud;
private float longitud;
private byte[] imagen;
public Solicitud() {
}
public Solicitud(int idservicio, int idfuente, String nombres, String telefono, String email, String detalle, float latitud, float longitud, byte [] imagen) {
this.idservicio = idservicio;
this.idfuente = idfuente;
this.nombres = nombres;
this.telefono = telefono;
this.email = email;
this.detalle = detalle;
this.latitud = latitud;
this.longitud = longitud;
this.imagen = imagen;
}
public int getIdservicio() {
return idservicio;
}
public void setIdservicio(int idservicio) {
this.idservicio = idservicio;
}
public int getIdfuente() {
return idfuente;
}
public void setIdfuente(int idfuente) {
this.idfuente = idfuente;
}
public String getNombres() {
return nombres;
}
public void setNombres(String nombres) {
this.nombres = nombres;
}
public String getTelefono() {
return telefono;
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getDetalle() {
return detalle;
}
public void setDetalle(String detalle) {
this.detalle = detalle;
}
public float getLatitud() {
return latitud;
}
public void setLatitud(float latitud) {
this.latitud = latitud;
}
public float getLongitud() {
return longitud;
}
public void setLongitud(float longitud) {
this.longitud = longitud;
}
public byte[] getImagen() {
return imagen;
}
public void setImagen(byte[] imagen) {
this.imagen = imagen;
}
@Override
public Object getProperty(int i) {
switch (i) {
case 0:
return idservicio;
case 1:
return idfuente;
case 2:
return nombres;
case 3:
return telefono;
case 4:
return email;
case 5:
return detalle;
case 6:
return latitud;
case 7:
return longitud;
case 8:
return imagen;
default:
break;
}
return null;
}
@Override
public int getPropertyCount() {
return 9;
}
@Override
public void setProperty(int i, Object o) {
switch (i) {
case 0:
idservicio = Integer.parseInt(o.toString());
break;
case 1:
idfuente = Integer.parseInt(o.toString());
break;
case 2:
nombres = o.toString();
break;
case 3:
telefono = o.toString();
break;
case 4:
email = o.toString();
break;
case 5:
detalle = o.toString();
break;
case 6:
latitud = Float.parseFloat(o.toString());
break;
case 7:
longitud = Float.parseFloat(o.toString());
break;
case 8:
imagen = byte[].class.cast(o);
break;
}
}
@Override
public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {
switch (i){
case 0:
propertyInfo.name = ID_SERVICIO;
propertyInfo.type = PropertyInfo.INTEGER_CLASS;
break;
case 1:
propertyInfo.name = ID_FUENTE;
propertyInfo.type = PropertyInfo.INTEGER_CLASS;
break;
case 2:
propertyInfo.name = ID_NOMBRES;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 3:
propertyInfo.name = TELEFONO;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 4:
propertyInfo.name = EMAIL;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 5:
propertyInfo.name = DETALLE;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 6:
propertyInfo.name = LATITUD;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 7:
propertyInfo.name = LONGITUD;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 8:
propertyInfo.name = IMAGEN;
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
}
}
@Override
public String getInnerText() {
return null;
}
@Override
public void setInnerText(String s) {
}
}
Этот метод дает мне байт [] из изображения, полученного по телефону
public byte[] getBytesFromBitmap(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
return stream.toByteArray();
}
Этот метод сборки объекта:
private void assembleSolicitud() {
String servicio = servicios_spnTipo.getSelectedItem().toString();
final FirebaseUser user = firebaseAuth.getCurrentUser();
String formatedNum = "(" + phoneNumber.substring(0, 3) + ")" + " " + phoneNumber.substring(3, 6) + "-" + phoneNumber.substring(6, 10);
int idservicio = 0;
if (servicio.equals("Alumbrado Publico")) {
idservicio = 1;
} else if (servicio.equals("Parques y Jardines")) {
idservicio = 3;
} else if (servicio.equals("Servicio de Limpia")) {
idservicio = 2;
}
Solicitud solicitud = new Solicitud();
solicitud.setIdservicio(idservicio);
solicitud.setIdfuente(5);
solicitud.setNombres(user.getDisplayName());
solicitud.setTelefono(formatedNum);
solicitud.setEmail(user.getEmail());
solicitud.setDetalle(servicios_etDescrip.getText().toString());
solicitud.setLatitud((float) latLngs[0]);
solicitud.setLongitud((float) latLngs[1]);
solicitud.setImagen(encodedImage);
insertSOAP(solicitud);
}
И этот метод является помощникомотправить мой объект "Solicitud" на wsdl
private void insertSOAP(Solicitud solicitud) {
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_INSERT);
request.addProperty("addSolicitud", solicitud);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.implicitTypes = true;
envelope.encodingStyle = SoapSerializationEnvelope.XSD;
MarshalBase64 mb64 = new MarshalBase64();
MarshalDouble md = new MarshalDouble();
mb64.register(envelope);
md.register(envelope);
envelope.setOutputSoapObject(request);
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
HttpTransportSE httpTransport = new HttpTransportSE(URL);
httpTransport.call(SOAP_ACTION_INSERT, envelope);
SoapObject result = (SoapObject) envelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Это мой веб-сервис wsdl
<xsd:complexType name="addSolicitud">
<xsd:all>
<xsd:element name="idservicio" type="xsd:int"/>
<xsd:element name="idfuente" type="xsd:int"/>
<xsd:element name="nombres" type="xsd:string"/>
<xsd:element name="telefono" type="xsd:string"/>
<xsd:element name="email" type="xsd:email"/>
<xsd:element name="detalle" type="xsd:string"/>
<xsd:element name="latitud" type="xsd:float"/>
<xsd:element name="longitud" type="xsd:float"/>
<xsd:element name="imagen" type="xsd:base64Binary"/>
</xsd:all>
</xsd:complexType>
Это моя 202 строка вкод, это тот, который доставляет мне проблемы:
httpTransport.call(SOAP_ACTION_INSERT, envelope);
Я действительно застрял в этой ошибке, если кто-то может помочь мне, я буду очень признателен.