Question

J'utilise le code suivant pour ouvrir une galerie à l'intérieur de mon application

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

Est-il possible de limiter la liste des images à seulement montrer images prises par la caméra? Affichage d'un Galerie sur mon système 2.1, les images sont regroupées donc il doit y avoir un paramètre qui définit à quel dossier il appartient.

Vérification de la MediaStore.Images.ImageColumns I ne pas trouver une colonne qui définirait une telle chose.

Suis-je tort? Parce que si je pouvais créer une requête pour filtrer par dossier et créer ma propre galerie vue, mon problème serait résolu.

Était-ce utile?

La solution

Vous avez juste besoin de mettre en œuvre MediaScannerConnectionClient dans votre activité et après que vous devez donner le chemin exact de l'un des fichier à l'intérieur que le nom du dossier ici SCAN_PATH et il va scanner tous les fichiers contenant dans ce dossier et ouvrir construit à l'intérieur dans la galerie. Il suffit donc de donner le nom de dossier vous et vous obtiendrez tous les fichiers à l'intérieur, y compris la vidéo. Si vous souhaitez ouvrir uniquement les images changent 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;
            }
        }
    }

Autres conseils

Aucune des réponses ci-dessus sont corrects, y compris celui marqué comme correct.

Voici la bonne solution réelle:

Le secret est de trouver le seau / album votre dossier est représenté comme. Les seaux apparaissent après Mediascan avec succès alors assurez-vous des images / vidéos que vous souhaitez afficher sont d'abord scannés en plusieurs fois démontré ci-dessus.

Supposons que j'ai un dossier indexé dans / 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;
    }
}

Maintenant que nous avons la bucketId pour notre album, nous pouvons l'ouvrir avec une simple intention.

Filtres fichiers vidéo:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

Filtres fichiers image:

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

Je peux vérifier cela fonctionne avec l'application Galerie intégrée. Kilométrage peut varier avec d'autres applications telles que Google Photos.

Je n'ai pas encore à comprendre comment ne pas les images / vidéo filtre, même si à l'intérieur de la galerie, vous pouvez sélectionner un album spécifique sans filtre.

je me suis dit cela en regardant la source de PSBA à l'application de la galerie.

Je n'ai pas assez réputation upvote ou un commentaire sur sa réponse, mais la réponse de ShellDude vous permet de mettre un URI répertoire dans la galerie intention. Ainsi, lorsque l'application de galerie est ouverte, il affiche toutes les images au lieu de 1.

Pour moi, la numérisation mes fichiers comme les réponses ci-dessus ne fonctionne pas. Interrogation de la MediaStore.Images.Media.EXTERNAL_CONTENT_URI ne fonctionnait après l'insertion de nouvelles lignes dans la table MediaStore.Images.Media.DATA avec le 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);

Voici une simplifiée

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

Pour ceux qui cela donne encore une activité non trouvée exception:

Vous devez spécifier le répertoire de votre dossier de demande intérieure. Non utilisateur root par défaut si les images et tout.

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

œuvres ... mais montrent KitKat une seule photo. J'ai réussi à le fixer pour les versions antérieures avec (galerie de mise à jour, lorsque l'image de stockage):

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top