2012-02-14 15 views
5

Estoy tratando de enviar una actualización fundamental a mi aplicación actualmente en el mercado. Necesito consultar las miniaturas en MediaStore y cargar las miniaturas en un GridView. Hasta ahora todo bien, ahora solo necesito obtener la ruta de la imagen real completa en el Almacenamiento Externo del usuario basado solo en lo que tengo (que es la ruta a la miniatura). Necesito poder realizar 4 acciones cada vez que un usuario haga clic en una miniatura, Compartir, Ver, Mover y Eliminar ... pero no puedo hacer nada de esto con solo la ruta en miniatura, lo he intentado todo, no lo hace trabajo :/. Aquí hay un fragmento de mi implementación a continuación, ¡cualquier ayuda u orientación sobre esto sería muy apreciada!Android obtiene una ruta a la imagen desde la miniatura?

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(); 

Hasta ahora hemos intentado todo con el miembro de imagePath, pero que, o bien provoca excepciones que se arrojen u otros errores. ¿Alguna sugerencia?

Respuesta

3

He encontrado la solución. Antes de consultar el MediaStore Content Resolver y obtener Miniaturas (no es lo que necesitaba de todos modos). Esta optimización me permite buscar en MediaStore de la misma manera, pero esta vez estoy buscando las imágenes REALES, y estoy devolviendo la miniatura MICRO_KIND. Las imágenes se almacenan en caché en una matriz de mapas de bits y luego se usan para poblar GridView. Ahora puedo obtener la ruta de la imagen real de tamaño completo en el dispositivo ... en caso de que necesite crear una instancia de URI o un archivo usando esa ruta, ahora puedo hacerlo fácilmente. Para cualquier otra persona que tenga este o un problema similar Android getting path to image from Thumbnail?, aquí está el código de la solución a continuación. Por cierto, estoy haciendo esto en una AsyncTask y mostrando/descartando un cuadro de diálogo de carga después de que se hayan visualizado todas las imágenes en el dispositivo.

/*----------------------------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); 
    } 



} 

Y aquí es mi onItemClick() El miembro de "nombre de archivo" es la que se uso para crear instancias de los URI o lo que hay que hacer con la imagen.

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

¿Qué tienes en el imageadapter para la vista de cuadrícula? – jxgn

+0

Muchas gracias por este código, pero no está dando la ruta exacta de la imagen seleccionada. Cuando estoy seleccionando la primera imagen, está dando la ruta de la segunda imagen. – Prabs

+0

[esto ayudó] (http://stackoverflow.com/a/6548026/4361127) – Prabs

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

utilice este código, creo que funcionará. Básicamente es la misma identificación tanto para la miniatura como para la imagen original, por lo que la posición para las imágenes en miniatura y las imágenes será la misma.

+0

No estoy seguro de entender lo que quieres decir. Como puede ver, ya estoy usando el código que publicó. Una solución más detallada, por favor. –

+0

He intentado tu código. No funciona, ya que estoy obteniendo Uris aleatorio de MediaStore y no el de la imagen de tamaño completo –

Cuestiones relacionadas