Pregunta

Estoy usando siguiente código para abrir una galería en el interior 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 sólo las imágenes tomadas por la cámara? Gallery en mi sistema 2.1, las imágenes se agrupan de manera que tiene que haber un parámetro que define a qué carpeta pertenece.

MediaStore.Images.ImageColumns I no encontramos una cualquiera de las columnas que definiría tal cosa.

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

¿Fue útil?

Solución

Sólo tiene que aplicar MediaScannerConnectionClient en su actividad y después de eso hay que darle la ruta exacta de uno de los archivos dentro de ese nombre de la carpeta aquí como SCAN_PATH y va a escanear todos los archivos que contienen en esa carpeta y abrirlo en el interior construido en la galería. Así que acaba de dar el nombre de la carpeta que usted y obtendrá todos los archivos dentro incluyendo video. Si desea cambiar sólo las imágenes abiertas 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;
            }
        }
    }

Otros consejos

Ninguna de las respuestas anteriores son correctas, incluyendo el marcado como correcta.

Aquí está la solución correcta real:

El secreto es encontrar el cubo / álbum de la carpeta se representa como. Cubos aparece después de exitosas MediaScan así que asegúrese de cualquier imágenes / vídeos que desea mostrar primero se digitalizan como se ha demostrado en múltiples ocasiones anteriormente.

Vamos a suponer que tengo una carpeta indexada en / sdcard / miaplicacion / 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 intento.

Filtros de archivos de vídeo:

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

Me puede verificar Esto funciona con la aplicación integrada en la Galería. Kilometraje puede variar con otras aplicaciones tales como Google Fotos.

Todavía tengo que encontrar la manera de no imágenes Filtro / video, a pesar de que dentro de la Galería, puede seleccionar un álbum específico sin filtro.

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

No tengo la reputación suficiente para upvote o comentario en su respuesta, pero la respuesta de ShellDude le permite poner un directorio URI en la galería intención. Así que cuando se abre la aplicación Galería que muestra todas las imágenes en vez de 1.

Para mí, el escaneo de los archivos como las respuestas anteriores no funcionaba. Consulta de la MediaStore.Images.Media.EXTERNAL_CONTENT_URI sólo funcionaba después de insertar nuevas filas en la tabla MediaStore.Images.Media.DATA con el 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);

Esta es una 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 los que esta actividad no siguen dando encontrado excepción:

Es necesario especificar el directorio de la carpeta de la aplicación interna. No usuario root por defecto 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;
            }
        }
    }

obras ... pero muestran KitKat sólo una foto. Me las arreglé para fijarlo para versiones anteriores con (galería de actualización, la imagen cuando el almacenamiento):

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top