2012-02-14 19 views
5

Sto provando a spedire un aggiornamento fondamentale alla mia app attualmente sul mercato. Devo interrogare le miniature nel MediaStore e caricare le anteprime in GridView. Fin qui tutto bene, ora ho solo bisogno di ottenere il percorso dell'immagine reale fullsized sull'archivio esterno dell'utente basato solo su ciò che ho (che è il percorso della miniatura). Devo essere in grado di eseguire 4 azioni ogni volta che un utente fa clic su una miniatura, Condividi, Visualizza, Sposta ed Elimina ... ma non posso fare nessuna di queste con solo il percorso della miniatura, ho provato tutto, non lavoro :/. Ecco uno snippet della mia implementazione qui sotto, qualsiasi aiuto o guida su questo sarebbe molto apprezzato!Android ottiene il percorso dell'immagine dall'anteprima?

public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

    int columnIndex = 0; 
    String[] projection = {MediaStore.Images.Media.DATA}; 
    Cursor cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, null); 

    if(cursor != null){ 
     columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

     cursor.moveToPosition(position); 
     imagePath = cursor.getString(columnIndex); 

     FileInputStream is = null; 
     BufferedInputStream bis = null; 

     try{ 
      is = new FileInputStream(new File(imagePath)); 
      bis = new BufferedInputStream(is); 
      Bitmap bitmap = BitmapFactory.decodeStream(bis); 
      useThisBitmap = Bitmap.createScaledBitmap(bitmap, parent.getWidth(), parent.getHeight(), true); 

      bitmap.recycle(); 
     }catch(Exception e){ 
      //Try to recover 
     } 
     finally{ 
      try{ 
       if(bis != null){ 
        bis.close(); 
       } 
       if(is != null){ 
        is.close(); 
       } 
       cursor.close(); 
       projection = null; 
      }catch(Exception e){ 

      } 
     } 
    } 
    Toast.makeText(this, " " + imagePath, Toast.LENGTH_SHORT).show(); 

Finora ho provato di tutto utilizzando il membro imagePath, ma che o fa sì che le eccezioni a essere gettati o di altri errori. Eventuali suggerimenti?

risposta

3

Ho trovato la soluzione. Prima di interrogare il Resolver dei contenuti di MediaStore e di catturare le miniature (non quello che mi serviva comunque). Questa ottimizzazione mi consente di cercare nel MediaStore nello stesso esatto modo, ma questa volta sto cercando le immagini EFFETTIVE e restituisco MICRO_KIND miniatura. Le immagini vengono quindi memorizzate nella cache in una matrice di Bitmap e quindi utilizzate per popolare GridView. Ora sono in grado di ottenere il percorso dell'immagine effettiva a dimensione intera sul dispositivo. Nel caso in cui sia necessario creare un'istanza URI o un file utilizzando tale percorso, ora posso facilmente. Per chiunque abbia questo o un problema simile Android getting path to image from Thumbnail?, ecco il codice della soluzione qui sotto. A proposito, sto facendo questo in un AsyncTask e mostrando/ignorando una finestra di dialogo di caricamento dopo che tutte le immagini sul dispositivo sono state visualizzate.

/*----------------------------ASYNC TASK TO LOAD THE PHOTOS--------------------------------------------------------*/ 

public class LoadPhotos extends AsyncTask<Object, Object, Object>{ 

    @Override 
    protected Object doInBackground(Object... params) { 
     final String[] columns = { MediaStore.Images.Media._ID }; 
     final String orderBy = MediaStore.Images.Media._ID; 

     Cursor imagecursor = managedQuery(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, 
       null, orderBy); 

     int image_column_index = imagecursor 
       .getColumnIndex(MediaStore.Images.Media._ID); 

     AllPhotosActivity.count = imagecursor.getCount(); 
     AllPhotosActivity.windows = new Bitmap[AllPhotosActivity.count]; 

     for (int i = 0; i < AllPhotosActivity.count; i++) { 
      imagecursor.moveToPosition(i); 
      //i = index; 
      int id = imagecursor.getInt(image_column_index); 
      windows[i] = MediaStore.Images.Thumbnails.getThumbnail(
        getApplicationContext().getContentResolver(), id, 
        MediaStore.Images.Thumbnails.MICRO_KIND, null); 
     } 

     imagecursor.close(); 
     return null; 

    } 

    @Override 
    protected void onPostExecute(Object result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     pd.dismiss(); 
     imagegrid.setAdapter(new ImageAdapter(getApplicationContext())); 

    } 

    @Override 
    protected void onProgressUpdate(Object... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 



} 

Ed ecco la mia onItemClick() Il socio "nomefile" è quello che si usa per creare istanze di URI o qualsiasi altra cosa che devi fare con l'immagine.

public void onItemClick(AdapterView<?> arg0, android.view.View v, 
       int position, long id) { 
      String[] columns = { MediaStore.Images.Media.DATA, 
        MediaStore.Images.Media._ID }; 
      Cursor actualimagecursor = managedQuery(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, 
        null, null, null); 

      final int dataColumnIndex = actualimagecursor 
        .getColumnIndex(MediaStore.Images.Media.DATA); 
      final int idColumIndex = actualimagecursor 
        .getColumnIndex(MediaStore.Images.Media._ID); 

      actualimagecursor.moveToPosition(position); 

      filename = actualimagecursor.getString(dataColumnIndex); 
      final long imageId = actualimagecursor.getLong(idColumIndex); 
+0

che cosa hai nel imageadapter per il gridview ??? – jxgn

+0

Grazie mille per questo codice, ma non sta dando il percorso esatto dell'immagine selezionata. Quando seleziono la prima immagine, è il percorso della 2 ° immagine. – Prabs

+0

[questo ha aiutato] (http://stackoverflow.com/a/6548026/4361127) – Prabs

0
Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null); 

utilizzare questo codice, penso che funzionerà. Fondamentalmente è lo stesso id sia per la miniatura che per l'immagine originale, quindi la posizione sia per le miniature sia per le immagini sarà la stessa.

+0

Non sono sicuro di capire cosa intendi. Come puoi vedere sto già usando il codice che hai postato. Una soluzione più dettagliata per favore. –

+0

Ho provato il tuo codice. Non funziona, poiché ricevo Uris casuale dal MediaStore e non quello per l'immagine intera –

Problemi correlati