Autore Topic: Generazione GridView con uri immagini da db  (Letto 1154 volte)

Offline jozmile

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildifre
  • Play Store ID:
    Artena
  • Sistema operativo:
    Win7 / Gentoo
Generazione GridView con uri immagini da db
« il: 04 Aprile 2011, 11:59:58 CEST »
0
Salve, ho un problema con le GridView. In pratica ho in un db un elenco di URI che puntano ad immagini, le volevo usare per popolare una GridView. Ho seguito alcuni tutorial, ma questo codice di test che uso non funziona, e mi genera un errore del tipo:
Codice: [Seleziona]
04-04 11:50:51.151: ERROR/AndroidRuntime(1972): java.lang.OutOfMemoryError: bitmap size exceeds VM budgetVi posto il codice relativo della Activity

Codice: [Seleziona]
package ...;

import...;
public class TripViewActivity2 extends Activity {
       
       
       
       
        @Override
         public void onCreate(Bundle savedInstanceState) {
               
               
                super.onCreate(savedInstanceState);
                cursor = db.fetchTapForItnId(6); //<- in questo test, questa istruzione riporta un cursor con un elenco di uri;
                    startManagingCursor(cursor);
                    setContentView(R.layout.test_view);
                    progressBar=(ProgressBar)findViewById(R.id.ProgressBar01);
                    sdCard=(GridView)findViewById(R.id.gridview);
                new LoadImages().execute((Void)null);                   
         }
        private class LoadImages extends AsyncTask<Void, Integer, Void>{

        @Override
        protected void onPreExecute() {
                progressBar.setVisibility(View.VISIBLE);
                super.onPreExecute();
        }


        @Override
        protected Void doInBackground(Void... params) {
                if(bitmaps==null){ // se non è null, inutile ricaricare tutto...
                        Options opts=new Options();
                        opts.inSampleSize=4; //evitiamo OutOfMemoryException
                        bitmaps=new Bitmap[cursor.getCount()];
                        Log.i(ACTIVITY_TAG, "Bitmap creata n:" + cursor.getCount());

                        if(cursor.moveToFirst()){
                                do{

                                        try {
                                                        String uri_string = cursor.getString(4);
                                                        uri = Uri.parse(uri_string);
                                                        InputStream is = getContentResolver().openInputStream(uri);
                                                        bitmaps[cursor.getPosition()]=BitmapFactory.decodeStream(is, null, opts);
                                                        } catch (FileNotFoundException e) {
                                               
                                                e.printStackTrace();
                                        }


                                }while(cursor.moveToNext());
                        }
                }
                publishProgress(View.GONE);

                return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
                progressBar.setVisibility(values[0]);
                super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(Void result) {
                sdCard.setAdapter(new ImageAdapter(getApplicationContext()));
                super.onPostExecute(result);
        }

}

       
        class ImageAdapter extends BaseAdapter {

        private Context context;

        public ImageAdapter(Context localContext) {
            context = localContext;
        }

        public int getCount() {
            return cursor.getCount();
        }
        public Object getItem(int position) {
            return position;
        }
        public long getItemId(int position) {
            return position;
        }
       
        public View getView(int position, View convertView, ViewGroup parent) {
               
            ImageView picturesView;
            if (convertView == null) {
                picturesView = new ImageView(context);
                picturesView.setLayoutParams(new GridView.LayoutParams(45, 45));
                picturesView.setImageURI(uri);
                picturesView.setAdjustViewBounds(false);
                picturesView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                picturesView.setPadding(8, 8, 8, 8);
                picturesView.setLayoutParams(new GridView.LayoutParams(100, 100));
            }
            else {
                picturesView = (ImageView)convertView;
            }
            picturesView.setImageBitmap(bitmaps[position]);
            return picturesView;
        }
    }
       
}

Thanks in advance.

Offline jozmile

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildifre
  • Play Store ID:
    Artena
  • Sistema operativo:
    Win7 / Gentoo
Re:Generazione GridView con uri immagini da db
« Risposta #1 il: 04 Aprile 2011, 12:06:11 CEST »
0
In realtà, per chiarezza vi espongo cosa dovrebbe fare la mia app, che tra l'altro è il mio progetto di tesi.
L'utente inserisce il nome di un percorso (la descrizione), e lungo questo percorso scatta delle foto che sono geotaggate. Ognuna di queste foto è salvata come Tappa di questo Percorso in un db SQLite.
L'Activity che mi rimane da realizzare è quella che visualizza tutte le foto (cioè tutte le Tappe) del Percorso selezionato. Ho pensato a questa GridView, ma mi sta facendo uscire matto, accetto anche suggerimenti su altre soluzioni. Inoltre, vi chiedo se invece di caricare l'URI dal db, si può risalire facilmente tramite il MediaStore. Cioè, quando scatto la foto, manipolo i riferimenti del MediaStore in modo da poter poi facilmente recuperare solo queste foto nella GridView.

Offline jozmile

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Wildifre
  • Play Store ID:
    Artena
  • Sistema operativo:
    Win7 / Gentoo
Re:Generazione GridView con uri immagini da db
« Risposta #2 il: 04 Aprile 2011, 12:24:16 CEST »
0
 O:-)
Il problema è nella getView(). Cioè, io vorrei caricare delle bitmap e il metodo mi va a saturare la memoria. Ho provato scattando foto ad una dimensione molto inferiore e il metodo infatti non satura. Le soluzioni quindi potrebbero essere
  • caricare l'uri della Thumbnail:
Sfruttando il MediaStore provider, facendo la query adatta (cioè cercando i riferimenti per le foto scattate solo dalla mia app). Cosa che non ho idea di come fare... Cioè se io volessi, nel momento in cui scatto la foto, posso "taggarla" in modo da poterla facilmente riottenere con il MediaStore?
  • A Runtime quando viene scattata la foto, facendo esattamente come nel mio test, cioè invece che scattare a qualità ottima, ad una qualità inferiore

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Generazione GridView con uri immagini da db
« Risposta #3 il: 04 Aprile 2011, 12:30:04 CEST »
0
Se il problema è nella dimensione delle immagini gestibili dalla GridView, non potresti (nel metodo getView) ridimensionare l'immagine che prelevi, riducendola ad una thumbnail?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store