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:
- Obtener imagen Uri en onActivityResult después de tomar la foto?
- Android Wear elimina datos de DataApi con deleteDataItems
- Android onNewIntent Uri es siempre nulo
- Cómo obtener HTML5 video URI en HTML5VFullScreen $ SurfaceVideoView en Android 4.0?
- Obtener datos Exif usando Uri
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.
- Obtener URI de la imagen dibujable
- Cómo restaurar el archivo vcf sin utilizar la aplicación externa?
- Android data.getData () devuelve null de CameraActivity para algunos teléfonos
- Cómo agregar una cláusula de límite utilizando el proveedor de contenido
- Poner una imagen grande en un ImageView no funciona
- ¿Por qué Android tiene su propia implementación de URI y no utiliza la implementación de Java por defecto?
- Empieza whatsapp con android.content.Intent.ACTION_SENDTO
- ¿Cómo getCropAndSetWallpaperIntent (Uri imageUri) para trabajar?
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.