Sdcard'a kaydedilen resim, Android'in Galeri uygulamasında görünmüyor


93

Bir resmi sdcard'a kaydediyorum ve sdcard'ı çıkarıp geri verene kadar Galeri uygulamasında görünmüyor.

Neden böyle olduğuna dair bir fikrin var mı?

Görünüşe göre Galeri uygulamasında dosya kaydedilirken güncellenmeyen bir önbellek var ...

Aslında, ben de Galeri uygulamasında sadece kaydedilen görüntüyü açmak ve hiçbir başarı elde etmek istiyoruz
bu bu konuda benim sorudur.


1
Bu soru, bu öğreticide adım adım yanıtlanmıştır: stackoverflow.com/questions/30506301/…
Takermania

Yanıtlar:



86

Daha basit bir çözüm, scanFile () statik uygunluk yöntemini kullanmaktır :

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

thisetkinliğiniz nerede (veya bağlam ne olursa olsun), mime türü yalnızca standart olmayan dosya uzantıları kullanıyorsanız ve nullisteğe bağlı geri arama için (bu kadar basit bir durumda ihtiyacımız olmayan) gereklidir .


2
Başkalarının (ve Google'ın) sağladığı yayın yöntemi çok nadiren işe yarıyor).
Chris.Jenkins

2
Bu benim için daha önceki Android sürümlerinde çalışıyordu ~ 4.0 ama şimdi 4.3+ çalışmıyor gibi görünüyor. Görüntüler galeri uygulamasında görünmüyor.
hooby3dfx

Mükemmel ! Şununla bağlam elde edebilirsiniz: Android.App.Application.Context
sürahi

Marshmallow'da çalıştı
Hitesh Sahu

66

Orijinal soruya ve bu sorunu yaşayan diğer kişilere cevabım:

Ben de aynı sorunu yaşıyordum, uygulamamdaki insanların SD karta kaydettiği resimler galerilerinde hemen görünmüyordu. Biraz arama yaptıktan sonra, sorunu çözen 'sdcard'a kaydet' kodumdan sonra eklenen bu kod satırını buldum:

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

Bu yayını kullanabilmek için medya tarayıcı kullanmamız gerekiyor mu? Galerimdeki resimleri görüntülemek için başka bir yöntem kullanıyorum. Yukarıdaki sendBroadcast'i kaydet düğmesini tıkladığımda galerim yeni resimle güncellenmiyor!
değişiklik

4
Eski ama bu birine yardımcı olabilir - daha özel bir yol: sendBroadcast (yeni Amaç (Intent.ACTION_MEDIA_MOUNTED, Uri.parse ("file: //" + Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)))); Bu yöntem (bu cevap, sadece benim yorumum değil) emülatörde çalışmıyor. Gerçek cihazda test edin.

Kabul edilen cevabın bunu yapmanın doğru yolunu sunduğuna inanıyorum. Ancak API <= 7'yi desteklemeye çalışıyorsanız, bu güzel bir yedektir.
Amr Mostafa

Cevabınız diğer cihazlar için yararlıdır. Uygulama klasörümü taramaya çalıştığımda HTC'de çalışmıyor. Yeni eklenen resmi göstermiyor.
MobileEvangelist

6
Bu, artık Android 4.4 veya sonraki sürümlerde desteklenmiyor gibi görünüyor. Bu durumda bir izin istisnası atılacaktır.
rsp1984

13

Ayrıca Medya Galerisine niyetle bir Resim ekleyebilir, nasıl yapıldığını görmek için örnek koda göz atabilirsiniz:

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

Selam. Bu yöntem, görüntüyü MediaStore'a ekler, geri gönderileni kontrol ederek onayladım Uriancak sorun eklenen görüntünün galeride gösterilmemesidir. Galerinin hem başında hem de sonunda kontrol ettim. Eklenen görüntünün hemen galeride görünmesi için herhangi bir yöntem önerebilir misiniz?
Shajeel Afzal

12

Android KITKAT dahil galeri yenileme

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

"IF" ifadesini içeren ilk koşuldaki kod, KitKat'ta benim için iyi çalışıyor (Android 4.4.4, API 19).
Alex

8

MediaScannerConnection için kod:

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

newfile, yeni / kaydedilmiş dosyanızın File nesnesidir.


2
Cevabınız için teşekkür ederim. Aslında bu projeyi uzun zaman önce bitirmiştim ... Kullandığım çözümün ne olduğunu bile hatırlamıyorum. Ayrıca şu uygulamaların da uygulanmasını sağlarsanız, diğer kullanıcılar çözümünüzü faydalı bulabilir MyMediaConnectorClient...
Michael Kessler

evet - şu anda bununla başım ağrıyor. Lütfen gönderin :)
Steve

Evet, akışın nasıl olması gerektiği konusunda gerçekten net değilim -Yanıldığım yerde beni düzeltin MediaScannerConnection'ı SDCAARD bilgilerini güncellemek için kullanabilirim, böylece kamerayla resim çekip yeni dosyayı MSC'ye aktarabilirim ve şimdi dosyaya erişebilirim bir bağlantı tarayıcı istemcisi ile?
Steve

Akış şudur: bir resim çekersiniz, sdcard'ınıza kaydedersiniz ve ardından tarayıcıyı güncellersiniz, böylece dosya sistemi, kaydedilen resminizi cihaz galerisinde görmek için güncellenir. Bunu tarayıcıyla yapmazsanız, galeride bir sonraki cihaz yeniden başlatıldıktan sonra resminizi görürsünüz.
3dmg

7

emülatörde "Dev Tools" yazan bir uygulama var

buna tıklayın ve 'Medya Taraması'nı seçin .. tüm resimler taranacak


bilmek harika, bunu söylemeden önce bildiğim tek yol telefonu yeniden başlatmak :)
mishkin

6

Etkinliğinizin 'MediaScannerConnectionClient'i uygulamasına ve bunu etkinliğinize eklemesine izin verin:

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

Selam! Ya Uriresmin ne olduğunu content://media/external/images/media/1231778
bilirsek

6

bu benimle çalış

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

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

Harici depolama alanında bulunan ve / storage / emulated / 0 / Android / data / <PackageName> / files / <FolderName> /xyz.gif yoluna sahip olan animasyonlu gif dosyasını kaydetmek istiyorum. Şimdi bu dosyayı Resim Galerisi'ne kaydetmek / kopyalamak ve orada göstermek istiyorum. Bu nasıl yapılır.
Zia Ur Rahman

3

Burada, görüntüyü bitmap biçiminde yükleyebilen ve bu görüntüyü uygulama adı klasöründeki sdcard galerisine kaydedebilen kodu paylaşıyorum. Bu adımları izlemelisiniz

  1. Önce Görüntü Bit Eşlemini İndirin



     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. Lütfen AndroidManifest.xml dosyanızda aşağıdaki izni de sağlayın.


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


  1. İşte bu görevi gerçekleştirmek istediğimiz Activty'de yazılan kodun tamamı.



     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. Umarım tüm probleminizi çözebilir.

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

KITKAT üzerinde çalışmıyor gibi görünüyor. İzin reddi istisnası atar ve uygulamayı çöker. Bunun için aşağıdakileri yaptım,

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

Umarım yardımcı olur.


2

Resmi kaydettikten sonra bunu kullanın

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

3
Bu işe yarıyor ama en iyi çözüm değil. Sistemi, SD kartın (yeniden) takılacağını ve muhtemelen tüm SD kartı yeniden taramaya zorlayacağını düşünmesi için kandırıyorsunuz. MediaScanner.scanFile (..), şimdi eklemek istediğiniz dosya olduğunda en iyi çözümdür.
pocmo

1
Bu, tüm görüntüleri arar. Ve galeride gösterilecek tek bir resmimiz olduğunda alakasız olabilecek birçok gereksiz veri işlemeyi içerir.
Rahul Rastogi

2

MyMediaConnectorClient için kodum:

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

0

Galeri uygulamasına izin vermeniz gerekiyor. Ana ekrandaki galeri uygulaması simgesine uzun basın ve ekranın üst kısmında açılan 'UYGULAMA BİLGİSİ' üzerine dokunun. Bunu yapmak galeri uygulama ayarlarını gösterecektir. Şimdi İzinler sekmesine gidin ve depolamayı, kamera izinlerini değiştirerek etkinleştirin. Şimdi yerel galeri uygulamanıza gidin ve kaydedilmiş resimlerinizi alacaksınız.


0

Bu, galerideki resminiz görünmüyorsa, bunun yerine ortada 404 tipi bir bit eşlem gösteriliyorsa sorununuzu çözecektir. Lütfen resminizle birlikte kodumda bulunan etiketleri ekleyin, çünkü galeride resim göstermek için bazı meta veriler olmalıdır.

      String resultPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)+ 
      getString(R.string.directory) + System.currentTimeMillis() + ".jpg";

       new File(resultPath).getParentFile().mkdir();

        try {
            OutputStream fileOutputStream = new FileOutputStream(resultPath);
            savedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (IOException e2) {
            e2.printStackTrace();
        }
        savedBitmap.recycle();

        File file = new File(resultPath);
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, "Photo");
        values.put(MediaStore.Images.Media.DESCRIPTION, "Edited");
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis ());
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
        values.put(MediaStore.Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode());
        values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US));
        values.put("_data", resultPath);

        ContentResolver cr = getContentResolver();
        cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);




        return  resultPath;

0

Bunu deneyin, oluşturulan yeni bir görüntü hakkında yayın yapacak, böylece görüntünüz görünür. bir galeri içinde. photoFile , yeni oluşturulan görüntünün gerçek dosya yolu ile değiştirilir

private void galleryAddPicBroadCast() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri contentUri = Uri.fromFile(photoFile);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.