Visualización de imágenes de una carpeta específica de la tarjeta SD mediante una vista de cuadrícula

Estoy intentando crear un gridview que esté cargado con las imágenes de una carpeta específica que resida en una tarjeta SD. El camino a la carpeta es conocido, ("/ sdcard / pictures"), pero en los ejemplos que he visto en línea no sé cómo o dónde especificar la ruta a la carpeta de imágenes de la que quiero cargar imágenes. He leído docenas de tutoriales, incluso el tutorial HelloGridView en developer.android.com, pero esos tutoriales no me enseñan lo que estoy buscando.

Cada tutorial que he leído hasta ahora tiene:

A) llamó a las imágenes como un Drawable de la carpeta / res y ponerlas en una matriz para cargar, no usar la SDCard en absoluto.

B) Acceso a todas las imágenes de la SDCard usando el MediaStore pero sin especificar cómo configurar la ruta a la carpeta que quiero mostrar imágenes form

o

C) Se sugiere usar BitmapFactory, que no tengo la menor idea de cómo usar.

Si voy sobre esto en el camino equivocado, por favor avíseme y me dirija hacia el método apropiado para hacer lo que estoy tratando de hacer.

OK, después de muchas iteraciones de intentar, finalmente tengo un ejemplo que funciona y pensé compartirlo. Mi ejemplo consulta las imágenes MediaStore, luego obtiene la miniatura de cada imagen para mostrar en una vista. Estoy cargando mis imágenes en un objeto de Gallery, pero eso no es un requisito para que este código funcione:

Asegúrese de tener un Cursor e int para el índice de columna definido en el nivel de clase para que el ImageAdapter de la Galería tenga acceso a ellos:

private Cursor cursor; private int columnIndex; 

Primero, obtenga un cursor de identificadores de imagen ubicados en la carpeta:

 Gallery g = (Gallery) findViewById(R.id.gallery); // request only the image ID to be returned String[] projection = {MediaStore.Images.Media._ID}; // Create the cursor pointing to the SDCard cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, MediaStore.Images.Media.DATA + " like ? ", new String[] {"%myimagesfolder%"}, null); // Get the column index of the image ID columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); g.setAdapter(new ImageAdapter(this)); 

A continuación, en el ImageAdapter para la Galería, obtenga la miniatura para mostrar:

 public View getView(int position, View convertView, ViewGroup parent) { ImageView i = new ImageView(context); // Move cursor to current position cursor.moveToPosition(position); // Get the current value for the requested column int imageID = cursor.getInt(columnIndex); // obtain the image URI Uri uri = Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(imageID) ); String url = uri.toString(); // Set the content of the image based on the image URI int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length())); Bitmap b = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null); i.setImageBitmap(b); i.setLayoutParams(new Gallery.LayoutParams(150, 100)); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setBackgroundResource(mGalleryItemBackground); return i; } 

Supongo que la sección más importante de este código es el managedQuery que demuestra cómo usar consultas MediaStore para filtrar una lista de archivos de imagen en una carpeta específica.

Necesita hacer algunos pasos más que el tutorial de GridView en developer.android.com. Utilizando el siguiente tutorial http://developer.android.com/resources/tutorials/views/hello-gridview.html

Usted querrá agregar un método para crear ImageView de los archivos de su tarjeta sd:

Crear / añadir un Vector a las variables de clase (para mantener una lista de ImageViews):

 private Vector<ImageView> mySDCardImages; 

Inicialice el vector:

 mySDCardImages = new Vector<ImageView>(); 

Cree un método para cargar imágenes:

 List<Integer> drawablesId = new ArrayList<Integer>(); int picIndex=12345; File sdDir = new File("/sdcard/pictures"); File[] sdDirFiles = sdDir.listFiles(); for(File singleFile : sdDirFiles) { ImageView myImageView = new ImageView(context); myImageView.setImageDrawable(Drawable.createFromPath(singleFile.getAbsolutePath()); myImageView.setId(picIndex); picIndex++; drawablesId.add(myImageView.getId()); mySDCardImages.add(myImageView); } mThumbIds = (Integer[])drawablesId.toArray(new Integer[0]); 

A continuación, en el método ImageAdapter, cambie

 imageView.setImageResource(mThumbIds[position]); 

a

 imageView.setImageDrawable(mySDCardImages.get(position).getDrawable()); 

Retire de ImageAdapter la inicialización de mThumbIds. (Debe ser hasta con la definición de mySDCardImages.) Accesible a ambos métodos de clase.

(Versión rápida y sucia) Asegúrese de probar su ruta, etc y coger cualquier excepción.

En su caso BitmaFactory podría ser un buen camino por recorrer. Ejemplo:

 File dir = new File( "/sdcard/pictures" ); String[] fileNames = dir.list(new FilenameFilter() { boolean accept (File dir, String name) { if (new File(dir,name).isDirectory()) return false; return name.toLowerCase().endsWith(".png"); } }); for(string bitmapFileName : fileNames) { Bitmap bmp = BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName); // do something with bitmap } 

No es tiempo de probar esto, pero debería funcionar 😉

Lea este enlace: http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html
Muestra cómo usar mediastore y bitmapfactory.

La manera que usted debe elegir depende de lo que usted necesita exactamente. Si usted tiene un conjunto estático de imágenes, es mucho mejor idea para ponerlos a drawables, creo, porque de esta manera es más rápido y no se basan en la tarjeta sd, que se puede quitar, corruptos o los archivos podrían ser renombrado / eliminado

Si las imágenes son dinámicas, utilice mediastore o bitmap fábrica. Pero tenga en cuenta que poner las imágenes en una matriz o algo que es bastante memoria consumiendo, por lo que puede acabar teniendo excepción outofmemory

Parece que quieres gallerry personalizado, se necesitará mucho tiempo para usted,

Sugiero que usted consiga la galería de la cámara de encargo para su funcionamiento.

Obtendrá Fotos / Videos en la vista de cuadrícula según desee.

  • Recuperar recursos extraíbles de Uri
  • Recuperación de datos del último evento agregado del calendario android
  • Cómo convertir una cadena en un android.net.Uri
  • El antiguo constructor de SimpleCursorAdapter desaprobó .. realmente?
  • Android Cómo obtener información de ID de una sola canción desde un URI conocido
  • Android lanzando url específica con un navegador específico
  • Android - ¿Cómo obtener Uri de archivo RAW?
  • Resolver el URI de diferentes fuentes en Android mientras se abre una imagen
  • Proveedor de contenido grant uri permission
  • El atributo pathPrefix de Deeplink de Android se está omitiendo
  • Identificador de fragmento (#) en Uri no funciona correctamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.