web-dev-qa-db-de.com

Das auf der SD-Karte gespeicherte Bild wird in der Android Gallery-App nicht angezeigt

Ich speichere ein Bild auf der SD-Karte und es erscheint nicht in der Galerie-Anwendung, bis ich die SD-Karte herausnehme und zurücksende.

Hast du eine Ahnung, warum das so ist?

Scheint, als hätte die Gallery-Anwendung einen Cache, der beim Speichern der Datei nicht aktualisiert wird ...

Eigentlich möchte ich auch das gerade gespeicherte Bild in der Galerie-Anwendung öffnen und habe damit keinen Erfolg 
das ist meine Frage zu diesem Thema.

80
Michael Kessler

Das System durchsucht die SD-Karte, wenn sie eingehängt ist, um neue Bilddateien (und andere Dateien) zu finden. Wenn Sie programmgesteuert eine Datei hinzufügen, können Sie diese Klasse verwenden:

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

41
hackbod

Eine einfachere Lösung ist die Verwendung der statischen Convenience-Methode scanFile () :

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

wenn this Ihre Aktivität (oder welcher Kontext auch immer) ist, ist der Mime-Typ nur erforderlich, wenn Sie nicht standardmäßige Dateierweiterungen verwenden, und null ist für den optionalen Rückruf (den wir für diesen einfachen Fall nicht benötigen).

79
darrenp

Meine Antwort auf die ursprüngliche Frage und alle anderen Personen, die dieses Problem haben könnten:

Ich hatte das gleiche Problem, Bilder in meiner App, die auf der SD-Karte gespeicherte Personen nicht sofort in ihrer Galerie angezeigt wurden. Nach einiger Suche fand ich diese eine Codezeile, die nach meinem "Save to SD-Card" -Code eingefügt wurde, der das Problem behoben hat:

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

Sie können der Media Gallery auch ein Bild hinzufügen, indem Sie einen bestimmten Code verwenden. 

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

Galerie-Aktualisierung einschließlich 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

Hier ist der Code für die MediaScannerConnection:

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

newfile ist das File-Objekt Ihrer neuen/gespeicherten Datei.

8
3dmg

es gibt eine App im Emulator, die besagt: "Dev Tools" 

klicken Sie darauf und wählen Sie "Media Scanning". Alle Bilder werden gescannt

7

Lassen Sie Ihre Aktivität "MediaScannerConnectionClient" Implementieren und fügen Sie dies Ihrer Aktivität hinzu:

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

diese Arbeit mit mir 

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

Scheint nicht an KitKat zu arbeiten. Es wirft eine Ausnahme wegen Berechtigungsverweigerung und stürzt die App ab . Deshalb habe ich Folgendes getan:

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

Ich hoffe es hilft.

3
Muhammad Riyaz

Hier teile ich Code, der das Bild in Form einer Bitmap laden und in der SD-Galerie im App-Namensordner speichern kann. Sie sollten diesen Schritten folgen 

  1. Laden Sie zuerst die Bild-Bitmap herunter



     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. Bitte geben Sie auch folgende Erlaubnis in Ihrer AndroidManifest.xml-Datei an.


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

  1. Hier ist der gesamte Code, der in Activty geschrieben ist und in dem wir diese Aufgabe ausführen möchten.



     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. Hoffe, dass es dein gesamtes Problem lösen kann.
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

Mein Code für 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

Verwenden Sie dies, nachdem Sie das Bild gespeichert haben

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

Sie müssen der Galerie-App Berechtigungen erteilen. __ Drücken Sie einfach lange auf das Symbol der Galerie-App auf dem Startbildschirm und tippen Sie auf "APP INFO", die oben im Bildschirm angezeigt wird. Dadurch werden die Einstellungen der Galerie-App angezeigt. Gehen Sie jetzt auf die Registerkarte Berechtigungen, und aktivieren Sie die Speicherung, die Kameraberechtigungen, indem Sie sie umschalten .. __ Gehen Sie jetzt in Ihre native Galerie-App und Sie erhalten die gespeicherten Bilder.

0
Devanshu Jain