我正在尝试上传通过Android Mobile录制的视频。但是,在将视频作为字节[]发送到服务器时,我要低于错误:
01-20 13:03:18.250: E/SaveMedia-response(4393): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
这是我尝试上传视频的方式:
SoapObject request = new SoapObject(
HelpMeConstant.WSDL_TARGET_NAMESPACE, "SaveMedia");
Log.i("SaveMedia-parameter", "Email : " + Email + ", Media : " + Media
+ "MediaType : " + MediaType + ",MediaExt : " + MediaExt);
MediaAvidance mediainfo = new MediaAvidance();
mediainfo.EmailId = Email;
mediainfo.Media = Media;
mediainfo.MediaExt = MediaExt;
mediainfo.MediaType = MediaType;
PropertyInfo pi = new PropertyInfo();
pi.setName("mediainfo");
pi.setValue(mediainfo);
pi.setType(mediainfo.getClass());
request.addProperty(pi);
/* request.addProperty("EmailId",Email);
request.addProperty("Media", Media);
request.addProperty("MediaType", MediaType);
request.addProperty("MediaExtn", MediaExt);
*/
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
Log.i("SaveMedia","Serialising..");
new MarshalBase64().register(envelope);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE(
HelpMeConstant.SOAP_ADDRESS);
Object response = null;
try {
Log.i("SaveMedia","Calling service..");
httpTransport.call(HelpMeConstant.SOAP_ACTION + "SaveMedia",
envelope);
Log.i("SaveMedia","getting response..");
response = envelope.getResponse();
} catch (Exception exception) {
response = exception.toString();
}
Log.i("response", response.toString());
return response.toString();
它正在发送到以下内容的.NET Web服务:
[WebMethod]
public string SaveMedia(MediaAvidance avidanceinfo)
{
rs = new ResultSet();
rs = logictask.SaveMedia(avidanceinfo.EmailId,avidanceinfo.Media,avidanceinfo.MediaType,avidanceinfo.MediaExt);
return rs.isSuccessfull;
}
mediaVidance:
public class MediaAvidance implements KvmSerializable {
public String EmailId;
public byte[] Media;
public String MediaType;
public String MediaExt;
public MediaAvidance() {
}
public MediaAvidance(String EmailID, byte[] Media, String MediaType,
String MediaExt) {
this.EmailId = EmailID;
this.Media = Media;
this.MediaType = MediaType;
this.MediaExt = MediaExt;
}
@Override
public Object getProperty(int arg0) {
switch (arg0) {
case GETEMAILID:
return EmailId;
case GETMEDIA:
return Media;
case GETMEDIATYPE:
return MediaType;
case GETMEDIAEXT:
return MediaExt;
default:
return null;
}
}
@Override
public int getPropertyCount() {
// TODO Auto-generated method stub
return 4;
}
@SuppressWarnings("rawtypes")
@Override
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
switch (index) {
case 0:
info.type = PropertyInfo.STRING_CLASS;
info.name = "EmailId";
break;
case 1:
info.type = PropertyInfo.OBJECT_CLASS;
info.name = "Media";
break;
case 2:
info.type = PropertyInfo.STRING_CLASS;
info.name = "MediaType";
break;
case 3:
info.type = PropertyInfo.STRING_CLASS;
info.name = "MediaExt";
break;
default:
break;
}
}
@Override
public void setProperty(int index, Object value) {
switch (index) {
case 0:
EmailId = value.toString();
break;
case 1:
Media = (byte[]) value;
break;
case 2:
MediaType = value.toString();
break;
case 3:
MediaExt = value.toString();
break;
default:
break;
}
}
}
在服务器端MediaVidance类Donot实施KvmSerializable
及其方法。
我搜索了几天,并在Stackoverflow&中遇到了许多问题。了解我要在连接关闭时试图编写,而且它与套接字编程有关。但是
我不知道如何保持连接(可能是我认为的解决方案)。请帮我。
谢谢Sourabh
我终于设法使它起作用。发布此解决方案,希望它对像我这样的人有用。您可能会在代码中遇到更多或任何以下问题,但是我很乐意犯这三个错误并向它们学习,这在视频上传中引起了问题:
- 我通过实现
KvmSerializable
在Android中序列化MediaAvidance
,但是为了使其工作,您的服务器端MediaAvidance
也必须序列化。我已经通过以下代码完成了解决我的Cannot Serialize
例外的代码:
[可序列化] 公共类MediaVidance
您还需要将SoapSerializationEnvelope
注册到MarshalBase64
:
envelope = new SoapSerializationEnvelope(Soapenvelope.ver11); 新元帅64()。注册(信封);
-
当您从Android调用时,在
PropertyInfo
中与您在服务方法参数中设置完全相同的名称(例如:AvidanceInfo),此求解了faultstring: 'Server was unable to read request.
例外:Android中定义的属性名称
pi.setname(" avidanceinfo");
服务方法:
[WebMethod] 公共字符串Savemedia(MediaVidance Avidanceinfo)
-
最终您需要添加
envelope.implicitTypes = true ;
因此HttpTransportSE
将能够在服务器上识别MediaAvidance
类型,您将获得Object reference not set to an instance of an object. when using xs:anyType....
例外。
*希望这对您有帮助。:) *