Mostrar imágenes desde una carpeta específica en la tarjeta SD usando una vista de grilla

Estoy intentando crear una vista de cuadrícula que está cargada con imágenes de una carpeta específica que reside en una tarjeta SD. La ruta a la carpeta es conocida (“/ sdcard / pictures”), pero en los ejemplos que he visto en línea no estoy seguro de cómo o dónde especificar la ruta a la carpeta de imágenes desde 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 Drawable desde la carpeta / res y las colocó en una matriz para cargarlas, sin usar la tarjeta SD en absoluto.

B) Accedí a todas las imágenes de la tarjeta SD usando MediaStore pero no especifiqué cómo configurar la ruta a la carpeta en la que quiero mostrar las imágenes.

o

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

Si estoy haciendo esto de la manera incorrecta, házmelo saber y dirígeme hacia el método adecuado para hacer lo que estoy tratando de hacer.

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

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

private Cursor cursor; private int columnIndex; 

Primero, obtenga un cursor de ID de imagen ubicado 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)); 

Luego, 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 ManageQuery, que demuestra cómo usar las consultas de MediaStore para filtrar una lista de archivos de imágenes en una carpeta específica.

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

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

Cree / agregue un Vector a sus variables de clase (para mantener una lista de ImageViews):

 private Vector mySDCardImages; 

Inicializa el vector:

 mySDCardImages = new Vector(); 

Crea un método para cargar imágenes:

 List drawablesId = new ArrayList(); 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]); 

Luego, en su método ImageAdapter, cambie

 imageView.setImageResource(mThumbIds[position]); 

a

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

Retire del ImageAdapter la inicialización de mThumbIds. (debe estar 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 atrapar cualquier excepción.

En su caso, BitmaFactory podría ser un buen camino a seguir. 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 hora 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 tanto mediastore como bitmapfactory.

la forma en que debe elegir depende de lo que necesita exactamente. si tienes un conjunto de imágenes estáticas, es mucho mejor idea ponerlas en modo arrastrable, creo, porque de esta forma es más rápido y no dependes de la tarjeta SD, que puede eliminarse, corromperse o los archivos pueden renombrarse / borrarse.

si las imágenes son dinámicas, utilice mediastore o fábrica de bitmap. pero tenga en cuenta que poner imágenes en una matriz o algo consume bastante memoria, por lo que puede terminar teniendo una excepción de memoria

Parece que quiere galerías personalizadas, le tomará mucho tiempo,

Le sugiero que obtenga Custom Camera Gallery para su trabajo.

Obtendrá fotos / videos en la vista de cuadrícula como lo desee.

para el código de Kotlin vea la respuesta de esta pregunta

la idea también es aplicable para Java (pero debe modificar el código)