I writed a WebService with C# .NET like this:
public void SaveImg(Byte[] data);
I want to send images to the server
Now,I can call this WebService on my android app,
and I have sent a small(less then 500KB) image file with kSOAP2 successfully;
But,when I choose a large(>500KB) image,it catch the Error "Out Of Memory",I spend so much time on this problem,but have no resolvent,can anybody help me?
My android code:
SoapObject request = new SoapObject(nameSpace, methodName);
byte[] bytes = readFile(ImgPath);
String s = new String(Base64.encode(bytes)); //Out Of Memory
request.addProperty("bytes", s);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(SERVER_URL);
androidHttpTransport.debug = true ;
androidHttpTransport.call(soapAction, envelope);
Related
Have anyone used Jain Sip to do a Sip registration on Android?
I'm currently using Jain Sip on Android and I'm trying to get a SIP registration working.
I can put the registration SIP message together ok but after sending the message it seems to just get sent back to my application and my applications processRequest() method is run.
Here is the code I'm using :
Code:
public void init(TextView tv) throws Exception {
SipFactory sipFactory = null;
sipStack = null;
sipFactory = SipFactory.getInstance();
sipFactory.setPathName("gov.nist");
Properties properties = new Properties();
properties.setProperty("javax.sip.OUTBOUND_PROXY", getLocalIpAddress()+":8002" + "/"
+ ListeningPoint.UDP);
properties.setProperty("javax.sip.STACK_NAME", "Sip Test");
// Create SipStack object
sipStack = sipFactory.createSipStack(properties);
tv.setText("sipStack = " + sipStack);
headerFactory = sipFactory.createHeaderFactory();
addressFactory = sipFactory.createAddressFactory();
messageFactory = sipFactory.createMessageFactory();
lp = sipStack.createListeningPoint(getLocalIpAddress(),
8002, ListeningPoint.UDP);
sipProvider = sipStack.createSipProvider(lp);
sipOnOffFlag = true;
tv.append("\n jain sip stack started on " + getLocalIpAddress() + ":" + myPort + "/" + ListeningPoint.UDP);
sipProvider.addSipListener(this);
String fromName = "019078020";
String fromSipAddress = "216.234.148.28";
String fromDisplayName = "Donal";
String toSipAddress = "216.234.148.28";
String toUser = "16784732970";
String toDisplayName = "Server";
// create >From Header
SipURI fromAddress = addressFactory.createSipURI(fromName,
getLocalIpAddress());
Address fromNameAddress = addressFactory.createAddress(fromAddress);
fromNameAddress.setDisplayName(fromDisplayName);
FromHeader fromHeader = headerFactory.createFromHeader(
fromNameAddress, null);
// create To Header
SipURI toAddress = addressFactory
.createSipURI(toUser, toSipAddress);
Address toNameAddress = addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(toDisplayName);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress,
null);
// create Request URI
SipURI requestURI = addressFactory.createSipURI(toUser,
"216.234.148.28");
// Create ViaHeaders
List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
String ipAddress = lp.getIPAddress();
ViaHeader viaHeader = headerFactory.createViaHeader(ipAddress,
lp.getPort(),
lp.getTransport(), null);
// add via headers
viaHeaders.add(viaHeader);
// Create ContentTypeHeader
ContentTypeHeader contentTypeHeader = headerFactory
.createContentTypeHeader("application", "sdp");
// Create a new CallId header
CallIdHeader callIdHeader = sipProvider.getNewCallId();
// Create a new Cseq header
CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L,
Request.REGISTER);
// Create a new MaxForwardsHeader
MaxForwardsHeader maxForwards = headerFactory
.createMaxForwardsHeader(70);
// Create the request.
Request request = messageFactory.createRequest(requestURI,
Request.REGISTER, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
// Create contact headers
SipURI contactUrl = addressFactory.createSipURI(fromName, getLocalIpAddress());
contactUrl.setPort(8002);
contactUrl.setLrParam();
// Create the contact name address.
SipURI contactURI = addressFactory.createSipURI(fromName, getLocalIpAddress());
contactURI.setPort(sipProvider.getListeningPoint(lp.getTransport())
.getPort());
Address contactAddress = addressFactory.createAddress(contactURI);
// Add the contact address.
contactAddress.setDisplayName(fromName);
contactHeader = headerFactory.createContactHeader(contactAddress);
request.addHeader(contactHeader);
// You can add extension headers of your own making
// to the outgoing SIP request.
// Add the extension header.
Header extensionHeader = headerFactory.createHeader("Expires",
"0");
request.addHeader(extensionHeader);
Log.d("SIP", "" + request.toString());
// Create the client transaction.
registerTid = sipProvider.getNewClientTransaction(request);
// send the request out.
registerTid.sendRequest();
dialog = registerTid.getDialog();
}
So the message gets built ok but when sendRequest() is run it doesn't appear to get sent to the server but rather back to my application and the applications processRequest method is run.
Should I be doing something extra with inviteTid or the dialog?
Do I need to create a socket or something to sent the request out?
Scratch that, got it working
Hello together,
I am trying to access a webservice with ksoap. I am able to get data from the webservice but only in the case I don't have to provide parameters.
I get always the error message "Server was unable to process request. ---> Sequence contains no elements" from the webservice. For me it looks like that the given properties are not provided to or not processed by the webservice.
I searched in the web for a couple of hours and could find out that some others have the same problem but couldn't find any solution
May anybody from the forum can help me....
My code is following
final String NAME_SPACE = "XXX";
final String URL = "XXX";
final String SOAP_ACTION = "XXX/GetMatchdataByLeagueSaison";
final String METHOD_NAME = "GetMatchdataByLeagueSaison";
SoapObject Request = new SoapObject(NAME_SPACE, METHOD_NAME);
Request.addProperty("leagueShortcut", "bl1");
Request.addProperty("leagueSaison", 2010);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(Request);
HttpTransportSE tns = new HttpTransportSE(URL);
try
{
tns.call(SOAP_ACTION, soapEnvelope);
SoapObject resultString = (SoapObject) soapEnvelope.getResponse();
String PropertyCount = String.valueOf(resultString.getPropertyCount()); // Anzahl Records
Log.i("GetMatchdataByLeagueSaison", "Anzahl Properties = " + PropertyCount);
result = "GetMatchdataByLeagueSaison " + PropertyCount;
}
catch(Exception e)
{
result = "GetMatchdataByLeagueSaison " + e.getMessage();
}
return result;
}
Hello, I want to download a xml file in local storage that I will parse.
The code is this
URL website = new URL("http://juventus.com/rss/news/ita.xml");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(c.getFilesDir()+"/eng.xml");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
This is called in doInBackground() of a AsyncTask class.
I get this error:
08-01 22:17:40.061: E/AndroidRuntime(9002): java.lang.RuntimeException: An error occured while executing doInBackground()
08-01 22:17:40.061: E/AndroidRuntime(9002): Caused by: java.lang.IllegalArgumentException: position=0 count=9223372036854775807
08-01 22:17:40.061: E/AndroidRuntime(9002): at java.nio.FileChannelImpl.transferFrom(FileChannelImpl.java:359)
What I do wrong?
I also tried this:
URL website = new URL("http://juventus.com/rss/news/ita.xml");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = c.openFileOutput("eng.xml", Context.MODE_PRIVATE);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
Hope you help me.
Thanks!
Try this...
Code:
URLConnection conn;
Log.d(TAG, "onDownload....path is: " + path);
try {
URL url = new URL(path);
conn = url.openConnection();
contentLength = conn.getContentLength();
DataInputStream in = new DataInputStream(conn.getInputStream());
Log.d(TAG, "Buffering the received stream(size=" + contentLength);
if (contentLength != -1) {
buffer = new byte[contentLength];
in.readFully(buffer);
in.close();
}else{
result = false;
return;
}
if (buffer.length > 0) {
Log.d(TAG,
"onDownload. Writing file to files dir,");
DataOutputStream out;
FileOutputStream fos = context.openFileOutput(fileName,
Context.MODE_PRIVATE);
Log.d(TAG, "Writing from buffer to the new file.." + fileName);
out = new DataOutputStream(fos);
out.write(buffer);
out.flush();
out.close();
result = true;
Edit: Here I am returning a boolean to indicate successful download.
I am trying to send an image to our asp.net webservice from android.Here is my sample code :
// Getting image from Gallery
Code:
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
picturePath = cursor.getString(columnIndex);
cursor.close();
/* BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;*/
thumbnail = (BitmapFactory.decodeFile(picturePath));
img_photo.setImageBitmap(thumbnail);
// converting imag into base64 string
Code:
img_photo.buildDrawingCache();
Bitmap bm = img_photo.getDrawingCache();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); // bm is the bitmap
byte[] photo = baos.toByteArray();
System.out.println("this is byte array" + bytearray);
String temp_base =Base64.encodeToString(photo,Base64.NO_WRAP);
// calling webservice
Code:
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("CarID", SellCarDetailView.sellcardetails_carid);
request.addProperty("pic",temp_base);
System.out.println("this is piccontent" +temp_base);
try {
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
soapEnvelope.encodingStyle = SoapEnvelope.ENC;
// new MarshalBase64().register(soapEnvelope);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(request);
HttpTransportSE aht = new HttpTransportSE(URL);
//AndroidHttpTransport aht = new AndroidHttpTransport(URL);
aht.call(SOAP_ACTION, soapEnvelope);
// SoapObject response = (SoapObject)envelope.getResponse();
SoapPrimitive response = (SoapPrimitive) soapEnvelope.getResponse();
String temp3 = response.toString();
Log.v("TAG", temp3);
} catch (Exception e) {
e.printStackTrace();
}
How ever i am getting "invalid parameter" at web service end.
// Asp.net code
Code:
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Xml)]
[WebMethod(EnableSession = true)]
public string UploadPictureByCarIDFromAndroid(string CarID, string make, string model, string year, string UserID, string pic, string AuthenticationID, string CustomerID, string SessionID)
{
string bStatus = "Failed";
MobileBL objMobile = new MobileBL();
UsedCarsInfo objCarPicInfo = new UsedCarsInfo();
try
{
try
{
if (AuthenticationID == ConfigurationManager.AppSettings["AppleID"].ToString())
{
objCarPicInfo.Carid = Convert.ToInt32(CarID);
byte[] picContent = Convert.FromBase64String(pic);
// byte[] picContent = Base64.decode(pic);
MemoryStream ms = new MemoryStream(picContent, 0,picContent.Length); // getting "invalid length"
ms.Write(picContent, 0, picContent.Length);
Bitmap oBitmap1 = new Bitmap(ms);// getting "invalid length" error here
// System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
}
}
catch (Exception ex)
{
}
}
catch (Exception ex)
{
}
return bStatus;
}
I am getting "invalid length" error when sending the image.Any help is highly appreciated.
i think a better approach is with stream rather file path
for example you can try
Get image from gallery
Code:
Uri selectedImage = data.getData();
BitmapFactory.Options options = new BitmapFactory.Options();
//your options
Bitmap img_photo = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, options);
convert to base64
Code:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
img_photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
String temp_base =Base64.encodeToString(byteArray,Base64.DEFAULT);
i cant see anything wrong in the web services call but shouldn't you send all the parameters the function needs?
also, try to change this
Code:
// SoapObject response = (SoapObject)envelope.getResponse();
SoapPrimitive response = (SoapPrimitive) soapEnvelope.getResponse();
String temp3 = response.toString();
to this
Code:
SoapObject response = (SoapObject)envelope.getResponse();
String temp3 = response.getProperty(0).toString();
warlock9_0 said:
i think a better approach is with stream rather file path
for example you can try
Get image from gallery
Code:
Uri selectedImage = data.getData();
BitmapFactory.Options options = new BitmapFactory.Options();
//your options
Bitmap img_photo = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, options);
convert to base64
Code:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
img_photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
String temp_base =Base64.encodeToString(byteArray,Base64.DEFAULT);
i cant see anything wrong in the web services call but shouldn't you send all the parameters the function needs?
also, try to change this
Code:
// SoapObject response = (SoapObject)envelope.getResponse();
SoapPrimitive response = (SoapPrimitive) soapEnvelope.getResponse();
String temp3 = response.toString();
to this
Code:
SoapObject response = (SoapObject)envelope.getResponse();
String temp3 = response.getProperty(0).toString();
Click to expand...
Click to collapse
Thanks for giving reply, i tried your code but getting the same problem.
sending to web service is ok?
trying this in the web service end?
Code:
Bitmap bmpReturn = null;
byte[] byteBuffer = Convert.FromBase64String(base64String);
MemoryStream memoryStream = new MemoryStream(byteBuffer);
memoryStream.Position = 0;
bmpReturn = (Bitmap)Bitmap.FromStream(memoryStream);
memoryStream.Close();
memoryStream = null;
byteBuffer = null;
0 down vote favorite
Im trying to pass this method for making a get request and passing the data as a String:
Code:
public String getdata(String url) throws ClientProtocolException,
IOException {
StringBuilder build = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
content));
String con;
while ((con = reader.readLine()) != null) {
build.append(con);
}
return build.toString();
}
into an asynctask because i cant run it in the main thread, I tried to do this but "build" cannot be accessed:
Code:
public class getHTTPdata extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... url) {
try {
StringBuilder build = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
content));
String con;
while ((con = reader.readLine()) != null) {
build.append(con);
}
return build.toString();
} catch (IOException e) {
}
return build;
}
}
I'd like to access it as:
getHTTPdata task = new getHTTPdata();
task.execute("myurl");
Thank you.
Make sure you added all required permissions, making an HTTP request requires Internet permission.