Autore Topic: out of memory dopo scatto Camera e preview in ImageView  (Letto 935 volte)

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
out of memory dopo scatto Camera e preview in ImageView
« il: 20 Febbraio 2012, 07:48:01 CET »
0
Premetto che precedentemente utilizzavo questo codice anzi c'era anche il resize e funzionava ma con il Galaxy Nexus mi da problemi di out of memory .

Ho 3 possibili scatti di foto con l' app nativa e devo far vedere le foto in 3 ImageView. Le prime due foto vanno bene.. alla terza di seguito mi va in out of memory. Ho modificato il codice più volte e l'ho ridotto all' osso e non uso più nessuna bitmap.
Ecco il codice.


Codice (Java): [Seleziona]
System.gc();
// creo un numero con il time della data
rnd_file = new Date().getTime();
// getTempFile crea una cartella e il nome del file in jpg
image_to_save = Uri.fromFile(UtilFile.getTempFile(this, rnd_file));
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, image_to_save);
startActivityForResult(intent, TAKE_PICTURE);

Dopo aver fatto la foto...
Premetto che ho un array di ImageView e un  array delle immagini inizializzato con la stringa "null" perchè l' utente quando cancella una foto devo far scalare le foto di un posto e poi per adesso le foto sono 3 ma possono aumentare...
Codice (Java): [Seleziona]
ImageView placeImg = null;
for (int m = 0; m < allimages.size(); m++) {
        if (allimages.get(m).equals("null")) {
            allimages.set(m, image_to_save.getPath());
             placeImg = arrayplace.get(m);
             placeImg.setImageURI(image_to_save);
             break;
                                                }
                                        }
                                       
                file= null;
               placeImg= null;
               selectedImage= null;
              image_to_save= null;
             System.gc();

Non capisco perchè alla terza foto mi da errore, ho stampato la stringa dell' URI e ImageView ed è tutto corretto.
Non creo nessuna bitmap... non capisco....

Vi posto il log...

Codice: [Seleziona]
02-20 07:44:15.374: E/dalvikvm-heap(6496): Out of memory on a 20155408-byte allocation.
02-20 07:44:15.374: I/dalvikvm(6496): "main" prio=5 tid=1 RUNNABLE
02-20 07:44:15.374: I/dalvikvm(6496):   | group="main" sCount=0 dsCount=0 obj=0x40a3b460 self=0x14a7830
02-20 07:44:15.374: I/dalvikvm(6496):   | sysTid=6496 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1074525320
02-20 07:44:15.374: I/dalvikvm(6496):   | schedstat=( 0 0 0 ) utm=678 stm=22 core=1
02-20 07:44:15.382: I/dalvikvm(6496):   at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.graphics.drawable.Drawable.createFromStream(Drawable.java:733)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.widget.ImageView.resolveUri(ImageView.java:562)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.widget.ImageView.setImageURI(ImageView.java:340)
02-20 07:44:15.382: I/dalvikvm(6496):   at eu.techmobile.android.smartapps.smarttravel.STAddNote.onActivityResult(STAddNote.java:403)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.app.Activity.dispatchActivityResult(Activity.java:4649)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.app.ActivityThread.access$1100(ActivityThread.java:123)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.os.Looper.loop(Looper.java:137)
02-20 07:44:15.382: I/dalvikvm(6496):   at android.app.ActivityThread.main(ActivityThread.java:4424)
02-20 07:44:15.382: I/dalvikvm(6496):   at java.lang.reflect.Method.invokeNative(Native Method)
02-20 07:44:15.390: I/dalvikvm(6496):   at java.lang.reflect.Method.invoke(Method.java:511)
02-20 07:44:15.390: I/dalvikvm(6496):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-20 07:44:15.390: I/dalvikvm(6496):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-20 07:44:15.390: I/dalvikvm(6496):   at dalvik.system.NativeStart.main(Native Method)
02-20 07:44:15.390: D/skia(6496): --- decoder->decode returned false


Avevo provato utilizzando Bitmap ma mi dava lo stesso errore... pensavo che utilizzando setImageUri fosse tutto più leggero...
Potrei e metterò un try/catch per out of memory ma deve funzionare...
Ripeto su un Nexus funzionva anche con Bitmap e il Resize ma con il Galaxy Nexus mi da questo problema... oggi provo con altri device.
La domanda stupida è quella che non si fa

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #1 il: 20 Febbraio 2012, 10:18:31 CET »
0
Potrei e metterò un try/catch per out of memory ma deve funzionare...

Mi pare che la OutOfMemory non puoi catcharla, purtroppo.
Comunque, cosa c'è alla linea 403, di preciso?

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #2 il: 20 Febbraio 2012, 10:55:59 CET »
0
Esattamente questo

Codice (Java): [Seleziona]
placeImg.setImageURI(image_to_save);
Poi ho provato sul GS2 e non vedo la foto... nemmeno nella prima :(
E' possibile che la foto non sia pronta?
La domanda stupida è quella che non si fa

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #3 il: 20 Febbraio 2012, 11:17:01 CET »
0
Riducendo la qualità della foto non va in errore...
La domanda stupida è quella che non si fa

Zate

  • Visitatore
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #4 il: 20 Febbraio 2012, 11:40:17 CET »
0
Prova ad aggiungere nel manifest nel tag application
Codice (XML): [Seleziona]
android:largeHeap="true"Devi comunque cercare di capire per quale motivo ricevi quell'errore, questo è solo un workaround. Infatti non bisogna usarlo solamente se si riceve un OutOfMemory, perché il garbage collector impiegherà più tempo a fare il suo lavoro, le app in background potrebbero essere terminate e l'utente se ne potrebbe accorgere. È da usare solamente quando sai dove usi tutta quella memoria e che non puoi farne a meno. Per più informazioni http://www.youtube.com/watch?v=_CruQY55HOk
« Ultima modifica: 20 Febbraio 2012, 11:41:50 CET da Zate »

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #5 il: 20 Febbraio 2012, 12:00:54 CET »
0
L' errore è che uso l' immagine che faccio come preview, ho ridotto la qualità e funziona tutto.. quindi per far vedere la miniatura basta fare foto molto piccole...
La domanda stupida è quella che non si fa

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #6 il: 26 Marzo 2012, 15:51:03 CEST »
0
Una volta che hai l'oggetto Bitmap, puoi ridurne la qualità (senza intaccare la foto originale) per evitare l'errore:

Codice (Java): [Seleziona]
byte[] bitmapdata;
ImageView preview;

//fotoBitmap è la bitmap

ByteArrayOutputStream bos = new ByteArrayOutputStream();  
fotoBitmap .compress(CompressFormat.JPEG, 70, bos);  
bitmapdata = bos.toByteArray();

//solo adesso setto la imageview
preview.setImageBitmap(fotoBitmap);
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:out of memory dopo scatto Camera e preview in ImageView
« Risposta #7 il: 26 Marzo 2012, 16:12:47 CEST »
0
Si poi ho fatto cosi...  :)

Grazie..
La domanda stupida è quella che non si fa