Upload immagine: Out of memory on a 31961104-byte allocation
Ciao, ho un problema quando provo ad inviare un file immagine dal mio smartphone ad un server remoto tramite un webservice.
L'errore è il seguente dal LogCat:
codice:
09-25 11:48:54.175: W/Choreographer(12979): Already have a pending vsync event. There should only be one at a time.
09-25 11:48:54.235: D/dalvikvm(12979): GC_FOR_ALLOC freed 1497K, 19% free 46108K/56648K, paused 54ms, total 54ms
09-25 11:48:54.235: I/dalvikvm-heap(12979): Forcing collection of SoftReferences for 31961104-byte allocation
09-25 11:48:54.280: D/dalvikvm(12979): GC_BEFORE_OOM freed 10K, 19% free 46098K/56648K, paused 43ms, total 43ms
09-25 11:48:54.280: E/dalvikvm-heap(12979): Out of memory on a 31961104-byte allocation.
09-25 11:48:54.280: I/dalvikvm(12979): "Thread-9829" prio=5 tid=11 RUNNABLE
09-25 11:48:54.280: I/dalvikvm(12979): | group="main" sCount=0 dsCount=0 obj=0x425e5cf8 self=0x5994b920
09-25 11:48:54.280: I/dalvikvm(12979): | sysTid=13515 nice=0 sched=0/0 cgrp=apps handle=1498943496
09-25 11:48:54.280: I/dalvikvm(12979): | state=R schedstat=( 87020166 10222375 29 ) utm=7 stm=1 core=1
09-25 11:48:54.280: I/dalvikvm(12979): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
09-25 11:48:54.285: I/dalvikvm(12979): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
09-25 11:48:54.285: I/dalvikvm(12979): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:378)
09-25 11:48:54.285: I/dalvikvm(12979): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:417)
09-25 11:48:54.285: I/dalvikvm(12979): at com.up.upload.MainActivity.UploadImage(MainActivity.java:202)
09-25 11:48:54.285: I/dalvikvm(12979): at com.up.upload.MainActivity$2.run(MainActivity.java:148)
09-25 11:48:54.285: I/dalvikvm(12979): at java.lang.Thread.run(Thread.java:841)
09-25 11:48:54.295: D/skia(12979): --- decoder->decode returned false
09-25 11:48:54.295: W/dalvikvm(12979): threadid=11: thread exiting with uncaught exception (group=0x41b55700)
09-25 11:48:54.300: E/AndroidRuntime(12979): FATAL EXCEPTION: Thread-9829
09-25 11:48:54.300: E/AndroidRuntime(12979): java.lang.OutOfMemoryError
09-25 11:48:54.300: E/AndroidRuntime(12979): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
09-25 11:48:54.300: E/AndroidRuntime(12979): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
09-25 11:48:54.300: E/AndroidRuntime(12979): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:378)
09-25 11:48:54.300: E/AndroidRuntime(12979): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:417)
09-25 11:48:54.300: E/AndroidRuntime(12979): at com.up.upload.MainActivity.UploadImage(MainActivity.java:202)
09-25 11:48:54.300: E/AndroidRuntime(12979): at com.up.upload.MainActivity$2.run(MainActivity.java:148)
09-25 11:48:54.300: E/AndroidRuntime(12979): at java.lang.Thread.run(Thread.java:841)
Questo il codice java in uso, cosa posso fare di più?
Grazie
codice:
public void UploadImage(String image, String imageName) {
SoapObject Request = new SoapObject(WSDL_TARGET_NAMESPACE,
OPERATION_NAME);
File mFile = new File(imagepath);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Bitmap bmp = BitmapFactory.decodeFile(mFile.getAbsolutePath());
bmp.recycle();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Request.addProperty("docbinaryarray", byteArray);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(SOAP_ADDRESS);
androidHttpTransport.debug = true;
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultString = (SoapPrimitive) envelope.getResponse();
Log.d("MainActivity.class", "Valore restituito: " + resultString);
} catch (Exception e) {
e.printStackTrace();
}
}
new Thread(new Runnable() {
public void run() {
try {
String lStr = imagepath;
UploadImage(
imagepath,
lStr.substring(lStr.lastIndexOf("/")).replace(
"/", ""));
} catch (Exception e) {
e.printStackTrace();
Log.e("MainActivity.class", "Errore nel metodo 2...", e);
}
}
}).start();