web-dev-qa-db-fra.com

L'image, enregistrée sur une carte SD, n'apparaît pas dans l'application Android Gallery

J'enregistre une image sur la carte SD et celle-ci n'apparaît pas dans l'application Galerie tant que je n'ai pas retiré la carte SD et que je ne l'ai retournée.

Avez-vous une idée pourquoi c'est comme ça?

On dirait que l'application Gallery a du cache qui n'est pas mis à jour lors de la sauvegarde des fichiers ...

En fait, je veux aussi ouvrir l’image que je viens de sauvegarder dans l’application Galerie et ne pas y réussir. 
this est ma question sur cette question.

80
Michael Kessler

Le système scanne la carte SD lorsqu'elle est montée pour rechercher de nouveaux fichiers image (et autres). Si vous ajoutez un fichier par programme, vous pouvez utiliser cette classe:

http://developer.Android.com/reference/Android/media/MediaScannerConnection.html

41
hackbod

Une solution plus simple consiste à utiliser la méthode de commodité statique scanFile () :

File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);

this est votre activité (ou quel que soit le contexte), le type mime n'est nécessaire que si vous utilisez des extensions de fichier non standard et la null correspond au rappel facultatif (ce dont nous n'avons pas besoin pour un cas aussi simple).

79
darrenp

Ma réponse à la question initiale et à toute autre personne pouvant avoir ce problème:

J'avais le même problème: les images de mon application enregistrées par des personnes enregistrées sur la carte SD ne figuraient pas immédiatement dans leur galerie. Après quelques recherches, j'ai trouvé cette ligne de code insérée après le code "enregistrer sur la carte sd" qui corrigeait le problème:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
65
ShadowGod

Vous pouvez également ajouter une image à la médiathèque par intention. Consultez l'exemple de code pour voir comment cela se passe: 

ContentValues image = new ContentValues();

image.put(Images.Media.TITLE, imageTitle);
image.put(Images.Media.DISPLAY_NAME, imageDisplayName);
image.put(Images.Media.DESCRIPTION, imageDescription);
image.put(Images.Media.DATE_ADDED, dateTaken);
image.put(Images.Media.DATE_TAKEN, dateTaken);
image.put(Images.Media.DATE_MODIFIED, dateTaken);
image.put(Images.Media.MIME_TYPE, "image/png");
image.put(Images.Media.ORIENTATION, 0);

 File parent = imageFile.getParentFile();
 String path = parent.toString().toLowerCase();
 String name = parent.getName().toLowerCase();
 image.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
 image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name);
 image.put(Images.Media.SIZE, imageFile.length());

 image.put(Images.Media.DATA, imageFile.getAbsolutePath());

 Uri result = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
13
Janusz

Actualisation de la galerie, y compris Android KitKat

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
{
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
}
else
{
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
12
AtanuCSE

Voici le code pour le MediaScannerConnection:

MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();

newfile est l'objet File de votre nouveau fichier/enregistré.

8
3dmg

il y a une application dans l'émulateur qui dit - 'Outils de développement' 

cliquez dessus et sélectionnez "Balayage multimédia" .. toutes les images seront numérisées

7
Abhishek Susarla

Laissez votre activité implémenter 'MediaScannerConnectionClient' Et ajoutez-la à votre activité:

private void startScan() 
{ 
    if(conn!=null) conn.disconnect();  
    conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); 
    conn.connect(); 
} 

@Override 
public void onMediaScannerConnected() { 
    try{
        conn.scanFile(yourImagePath, "image/*");
       } catch (Java.lang.IllegalStateException e){
       }
}

@Override 
public void onScanCompleted(String path, Uri uri) { 
    conn.disconnect(); 
} 
6
TOMKA

ce travail avec moi 

File file = ..... // Save file

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
5
user3245604
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

Ne semble pas fonctionner sur KitKat. Il lève l'exception de refus d'autorisation et bloque l'application .

String path = mediaStorageDir.getPath() + File.separator
                    + "IMG_Some_name.jpg";
CameraActivity.this.sendBroadcast(new Intent(
                             Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                            .parse("file://" + path)));

J'espère que ça aide.

3
Muhammad Riyaz

Je partage ici le code qui permet de charger une image sous forme de bitmap et de l'enregistrer sur la galerie sdcard dans le dossier de noms d'applications ..__ Vous devriez suivre ces étapes 

  1. Téléchargez d'abord l'image bitmap



     private Bitmap loadBitmap(String url) {
        try {
            InputStream in = new Java.net.URL(url).openStream();
            return BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
       }

  1. Veuillez également fournir l'autorisation suivante dans votre fichier AndroidManifest.xml.


    uses-permission Android:name="Android.permission.INTERNET" 
    uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"

  1. Voici tout le code écrit dans Activty dans lequel nous souhaitons effectuer cette tâche.



     void saveMyImage(String appName, String imageUrl, String imageName) {

            Bitmap bmImg = loadBitmap(imageUrl);
            File filename;
            try {
                String path1 = Android.os.Environment.getExternalStorageDirectory()
                        .toString();
                File file = new File(path1 + "/" + appName);
                if (!file.exists())
                    file.mkdirs();
                filename = new File(file.getAbsolutePath() + "/" + imageName
                        + ".jpg");
                FileOutputStream out = new FileOutputStream(filename);
                bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
                ContentValues image = new ContentValues();
                image.put(Images.Media.TITLE, appName);
                image.put(Images.Media.DISPLAY_NAME, imageName);
                image.put(Images.Media.DESCRIPTION, "App Image");
                image.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
                image.put(Images.Media.MIME_TYPE, "image/jpg");
                image.put(Images.Media.ORIENTATION, 0);
                File parent = filename.getParentFile();
                image.put(Images.ImageColumns.BUCKET_ID, parent.toString()
                        .toLowerCase().hashCode());
                image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, parent.getName()
                        .toLowerCase());
                image.put(Images.Media.SIZE, filename.length());
                image.put(Images.Media.DATA, filename.getAbsolutePath());
                Uri result = getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
                Toast.makeText(getApplicationContext(),
                        "File is Saved in  " + filename, Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

  1. J'espère que cela pourra résoudre tout votre problème.
3
VISHNU GARG
 File folderGIF = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/newgif2");    //path where gif will be stored
success = folderGIF.mkdir();    //make directory
 String finalPath = folderGIF + "/test1.gif";  //path of file
.....
/* changes in gallery app if any changes in done*/
 MediaScannerConnection.scanFile(this,
                    new String[]{finalPath}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                            Log.i("ExternalStorage", "Scanned " + path + ":");
                            Log.i("ExternalStorage", "-> uri=" + uri);
                        }
                    });
3
Khyati Fatania

Mon code pour MyMediaConnectorClient:

public class MyMediaConnectorClient implements MediaScannerConnectionClient {

    String _fisier;
    MediaScannerConnection MEDIA_SCANNER_CONNECTION;

    public MyMediaConnectorClient(String nume) {
        _fisier = nume;
    }

    public void setScanner(MediaScannerConnection msc){
        MEDIA_SCANNER_CONNECTION = msc;
    }

    @Override
    public void onMediaScannerConnected() {
        MEDIA_SCANNER_CONNECTION.scanFile(_fisier, null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        if(path.equals(_fisier))
            MEDIA_SCANNER_CONNECTION.disconnect();
    }
}
2
Marian

Utilisez ceci après avoir sauvegardé l'image

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
2
Deepu

Vous devez donner des autorisations à l'application Galerie . Il suffit d'appuyer longuement sur l'icône de l'application Galerie dans l'écran d'accueil et de taper sur 'APP INFO' qui apparaît en haut de l'écran. Cela affichera les paramètres de l'application de la galerie. Maintenant, allez dans l'onglet Autorisations et activez le stockage, les autorisations de l'appareil photo en le basculant .. Maintenant, allez dans votre application de galerie native et vous obtiendrez vos images enregistrées.

0
Devanshu Jain