Galería con filtro de carpeta

Estoy usando el siguiente código para abrir una galería dentro de mi aplicación

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, FIND_RESULT); 

¿Es posible limitar una lista de imágenes para mostrar solo imágenes tomadas por cámara? Viendo la Galería en mi sistema 2.1, las imágenes se agrupan así que tiene que haber un parámetro que defina a qué carpeta pertenece.

Comprobando MediaStore.Images.ImageColumns No encontré ninguna columna que definiera tal cosa.

¿Podría estar equivocado? Porque si pudiera crear una consulta para filtrar por carpeta y crear mi propia vista de galería, entonces mi problema estaría resuelto.

Solo necesita implementar MediaScannerConnectionClient en su actividad y luego debe dar la ruta exacta de uno de los archivos dentro de ese nombre de carpeta aquí como SCAN_PATH y escaneará todos los archivos que contengan esa carpeta y la abrirá dentro de la galería. Así que solo da el nombre de tu carpeta y obtendrás todos los archivos, incluido el video. Si desea abrir solo imágenes, cambie FILE_TYPE="image/*"

 public class SlideShow extends Activity implements MediaScannerConnectionClient { public String[] allFiles; private String SCAN_PATH ; private static final String FILE_TYPE = "*/*"; private MediaScannerConnection conn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); File folder = new File("/sdcard/yourfoldername/"); allFiles = folder.list(); SCAN_PATH=Environment.getExternalStorageDirectory().toString()+"/yourfoldername/"+allFiles[0]; Button scanBtn = (Button) findViewById(R.id.scanBtn); scanBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { startScan(); } }); } private void startScan() { if(conn!=null) { conn.disconnect(); } conn = new MediaScannerConnection(this, this); conn.connect(); } public void onMediaScannerConnected() { conn.scanFile(SCAN_PATH, FILE_TYPE); } public void onScanCompleted(String path, Uri uri) { try { if (uri != null) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); } } finally { conn.disconnect(); conn = null; } } } 

Ninguna de las respuestas anteriores es correcta, incluida la marcada como correcta.

Aquí está la solución correcta real:

El secreto es encontrar el cubo / álbum en el que está representada tu carpeta. Los intervalos aparecen después de un exitoso MediaScan, así que asegúrese de que las imágenes / videos que desea mostrar se escaneen primero como se demostró varias veces anteriormente.

Supongamos que tengo una carpeta indexada en / sdcard / myapp / myappsmediafolder :

 String bucketId = ""; final String[] projection = new String[] {"DISTINCT " + MediaStore.Images.Media.BUCKET_DISPLAY_NAME + ", " + MediaStore.Images.Media.BUCKET_ID}; final Cursor cur = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null); while (cur != null && cur.moveToNext()) { final String bucketName = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME))); if (bucketName.equals("myappsmediafolder")) { bucketId = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_ID))); break; } } 

Ahora que tenemos el bucketId para nuestro álbum, podemos abrirlo con un simple bash.

Filtros de archivos de video:

 Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 

Filtros de archivos de imagen:

 Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

 if (bucketId.length() > 0) { mediaUri = mediaUri.buildUpon() .authority("media") .appendQueryParameter("bucketId", bucketId) .build(); } Intent intent = new Intent(Intent.ACTION_VIEW, mediaUri); startActivity(intent); 

Puedo verificar que esto funcione con la aplicación de Galería integrada. El kilometraje puede variar con otras aplicaciones, como Google Fotos.

Todavía tengo que descubrir cómo no filtrar imágenes / videos, aunque dentro de Galería puedes seleccionar un Álbum específico sin filtro.

Me di cuenta de esto mirando la fuente AOSP a la aplicación de la galería.

No tengo suficiente reputación para votar o comentar su respuesta, pero la respuesta de ShellDude le permite poner un URI de directorio en la intención de la galería. Entonces, cuando se abre la aplicación de la galería, muestra todas las imágenes en lugar de 1.

Para mí, escanear mis archivos como las respuestas anteriores no funcionó. La consulta de MediaStore.Images.Media.EXTERNAL_CONTENT_URI solo funcionó después de insertar nuevas filas en la tabla MediaStore.Images.Media.DATA con ContentResolver:

 ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, image.getPath()); values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg"); contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

Aquí hay uno simplificado

 private MediaScannerConnection conn; private void notifySystemWithImage(final File imageFile) { conn = new MediaScannerConnection(this, new MediaScannerConnectionClient() { @Override public void onScanCompleted(String path, Uri uri) { try { if (uri != null) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "image/*"); startActivity(intent); } } finally { conn.disconnect(); conn = null; } } @Override public void onMediaScannerConnected() { conn.scanFile(imageFile.getAbsolutePath(), "*/*"); } }); conn.connect(); } 

Para aquellos que aún dan actividad no encontrada excepción:

Debe especificar el directorio de la carpeta de la aplicación interna. No es usuario root predeterminado si las imágenes y todo.

 public class SlideShow extends Activity implements MediaScannerConnectionClient { public String[] allFiles; private String SCAN_PATH ; private static final String FILE_TYPE = "*/*"; private MediaScannerConnection conn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); File folder = new File(HistoryActivity.this.getExternalFilesDir(null)+"/a/"); allFiles = folder.list(); SCAN_PATH= HistoryActivity.this.getExternalFilesDir(null)+"/a/"+allFiles[0]; Button scanBtn = (Button) findViewById(R.id.scanBtn); scanBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { startScan(); } }); } private void startScan() { if(conn!=null) { conn.disconnect(); } conn = new MediaScannerConnection(this, this); conn.connect(); } public void onMediaScannerConnected() { conn.scanFile(SCAN_PATH, FILE_TYPE); } public void onScanCompleted(String path, Uri uri) { try { if (uri != null) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); } } finally { conn.disconnect(); conn = null; } } } 

funciona … pero Kitkat muestra solo una foto. Logré arreglarlo para versiones anteriores con (actualización de la galería, al almacenar la imagen):

 public void savePhoto(Bitmap bmp) { File imageFileFolder = new File(context.getExternalFilesDir(null)+"/a/") ; imageFileFolder.mkdir(); FileOutputStream out = null; Calendar c = Calendar.getInstance(); String date = fromInt(c.get(Calendar.MONTH)) + fromInt(c.get(Calendar.DAY_OF_MONTH)) + fromInt(c.get(Calendar.YEAR)) + fromInt(c.get(Calendar.HOUR_OF_DAY)) + fromInt(c.get(Calendar.MINUTE)) + fromInt(c.get(Calendar.SECOND)); File imageFileName = new File(imageFileFolder, date.toString() + ".jpg"); try { out = new FileOutputStream(imageFileName); bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); scanPhoto(imageFileName.toString()); out = null; } catch (Exception e) { e.printStackTrace(); } } public String fromInt(int val) { return String.valueOf(val); } public void scanPhoto(final String imageFileName) { msConn = new MediaScannerConnection(context,new MediaScannerConnection.MediaScannerConnectionClient() { public void onMediaScannerConnected() { msConn.scanFile(imageFileName, null); Log.i("msClient obj in Photo Utility", "connection established"); } public void onScanCompleted(String path, Uri uri) { msConn.disconnect(); Log.i("msClient obj in Photo Utility","scan completed"); } }); msConn.connect(); }