2010-10-25 16 views
8

estoy usando siguiente código para abrir una galería en el interior de mi aplicaciónGalería con filtro carpeta

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? 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 el 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.

+0

@ Freakman: ¿Encontró la American National Standard ?, si es así por favor comparta i necesito lo mismo. – PiyushMishra

+0

No, no encontré la respuesta. – FrEaKmAn

Respuesta

9

Solo necesita implementar MediaScannerConnectionClient en su actividad y luego debe indicar aquí la ruta exacta de uno de los archivos dentro de esa carpeta como SCAN_PATH y escaneará todos los archivos que contengan esa carpeta y la abrirá dentro construido en la galería. Así que solo da el nombre de tu carpeta y obtendrás todos los archivos, incluido el video. Si desea abrir sólo las imágenes cambian 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; 
      } 
     } 
    } 
+0

mostrará una imagen a la vez ¿por qué? como si tuviera 6 imágenes en la carpeta y si escribo allFiles [0], se mostrará 1 imagen, luego escribiré AllFiles [1], se mostrarán 2 imágenes, etc. Pero quiero mostrar todas las imágenes a la vez. –

+0

necesita galería aman para mostrar todas las imágenes a la vez; este ejemplo no le dice a ninguna parte cómo mostrar sus datos, simplemente crea una matriz de cadenas que contiene la ruta de todos los archivos dentro de esa carpeta. Puede usar este conjunto de cadenas en ur gallary para mostrar sus imágenes. – PiyushMishra

+0

Esto abre la imagen específica no la carpeta en la galería –

0

Aquí es un sistema simplificado de un

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(); 
} 
+0

Esto cargará solo una imagen, donde como necesito todas las imágenes de la carpeta dada. –

+0

Se abrirá la imagen en su carpeta, y podrá deslizar hacia la derecha e izquierda para ver otras imágenes. Igual que la galería. –

0

Para los que esto todavía da la actividad no se encuentra una excepción:

Es necesario especificar directorio de su carpeta interna de la aplicación. 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)+"https://stackoverflow.com/a/"); 
      allFiles = folder.list(); 

      SCAN_PATH= HistoryActivity.this.getExternalFilesDir(null)+"https://stackoverflow.com/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 mostrar solo una foto. Me las arreglé para fijarlo 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)+"https://stackoverflow.com/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(); 
} 
3

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

Aquí está la solución correcta real:

El secreto es encontrar el cubo/álbum de la carpeta se representa como. 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/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 una intención sencilla.

Filtros de archivos de vídeo:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 

archivos de filtros 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 el incorporado en la aplicación Galería. 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 puede seleccionar un álbum específico sin filtro.

Lo descubrí mirando la fuente de AOSP a la aplicación de la galería.

+0

He subido ya. Esta solución funcionó perfectamente hasta API 5. Pero para API 6 muestra solo 1 foto. Tengo que desplazarme para moverme a la siguiente foto. ¿Cómo hacer que funcione para API 6? Por favor hagamelo saber. ¡Gracias! – masiboo

+0

¿Hay alguna forma de obtener nombres de carpetas combinadas para imágenes y videos en el mismo cursor? –

0

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 la aplicación de la galería se abre, muestra todas las imágenes en lugar de 1.

Para mí, el escaneo de mis archivos como las respuestas anteriores no funcionó. 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); 
+0

extraño, ya que hubiera esperado que un mediascan hiciera lo anterior por usted. ¿Hay un archivo .nomedia o similar en la ruta a su carpeta? – ShellDude

Cuestiones relacionadas