Gambar, disimpan ke sdcard, tidak muncul di aplikasi Galeri Android

93

Saya menyimpan gambar ke sdcard dan itu tidak muncul di aplikasi Galeri sampai saya menarik kartu sd dan mengembalikannya kembali.

Apakah Anda tahu mengapa demikian?

Sepertinya aplikasi Galeri memiliki beberapa cache yang tidak diperbarui pada penyimpanan file ...

Sebenarnya, saya juga ingin membuka gambar yang baru saja disimpan di aplikasi Galeri dan tidak berhasil dengan itu,
inilah pertanyaan saya tentang masalah ini.

Michael Kessler
sumber
1
Pertanyaan ini telah dijawab selangkah demi selangkah dalam tutorial ini: stackoverflow.com/questions/30506301/…
Takermania

Jawaban:

45

Sistem memindai kartu SD saat dipasang untuk menemukan file gambar baru (dan lainnya). Jika Anda menambahkan file secara terprogram, Anda dapat menggunakan kelas ini:

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

hackbod
sumber
4
Catatan sampingan: Meskipun pertanyaannya mengacu pada penambahan file, MediaScannerConnection tidak menyediakan solusi untuk penghapusan file - bahkan saat meminta untuk memindai folder induk dari file yang dihapus.
AlikElzin-kilaka
86

Solusi yang lebih sederhana adalah dengan menggunakan metode kemudahan statis scanFile () :

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

di mana thisaktivitas Anda (atau konteks apa pun), jenis mime hanya diperlukan jika Anda menggunakan ekstensi file non-standar dan nullis untuk callback opsional (yang tidak kami perlukan untuk kasus sederhana seperti itu).

sayang
sumber
2
Spot on, metode siaran yang disediakan orang lain (dan google), sangat jarang berhasil).
Chris.Jenkins
2
Ini berfungsi untuk saya di versi Android sebelumnya ~ 4.0 tetapi sekarang di 4.3+ sepertinya tidak berfungsi. Gambar tidak muncul di aplikasi galeri.
hooby3dfx
Sempurna! Anda bisa mendapatkan konteks dengan: Android.App.Application.Context
jug
Bekerja di marshmallow
Hitesh Sahu
66

Jawaban saya atas pertanyaan awal dan kepada siapa pun yang mungkin memiliki masalah ini:

Saya mengalami masalah yang sama, gambar di aplikasi saya yang disimpan orang ke kartu SD tidak segera muncul di Galeri mereka. Setelah beberapa pencarian, saya menemukan satu baris kode ini dimasukkan setelah kode 'simpan ke sdcard' saya yang memperbaiki masalah:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
ShadowGod
sumber
Apakah kita perlu menggunakan pemindai media untuk dapat menggunakan siaran ini? saya menggunakan metode lain untuk menampilkan gambar di galeri saya. Ketika saya menggunakan sendBroadcast di atas tombol simpan klik galeri saya tidak diperbarui dengan gambar baru!
ubah
4
Sudah lama tetapi ini dapat membantu seseorang - jalur yang lebih spesifik: sendBroadcast (Intent baru (Intent.ACTION_MEDIA_MOUNTED, Uri.parse ("file: //" + Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)))); Metode ini (jawaban ini, bukan hanya komentar saya) tidak berfungsi di emulator. Uji di perangkat nyata.
Saya yakin jawaban yang diterima menawarkan cara yang benar untuk melakukannya. Tetapi jika Anda mencoba untuk mendukung API <= 7 maka ini adalah fallback yang bagus.
Amr Mostafa
Jawaban Anda berguna untuk perangkat lain. Ini tidak berfungsi di HTC, Saat saya mencoba memindai folder Aplikasi saya. Itu tidak muncul gambar yang baru ditambahkan.
MobileEvangelist
6
Sepertinya ini tidak lagi didukung di Android 4.4 atau lebih tinggi. Pengecualian izin akan dilemparkan dalam kasus ini.
rsp1984
13

Anda juga bisa menambahkan Gambar ke Galeri Media dengan sengaja, lihat kode contoh untuk melihat bagaimana hal itu dilakukan:

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);
Janusz
sumber
Hai. Metode ini menambahkan gambar ke MediaStore, saya telah mengonfirmasi dengan memeriksa yang dikembalikan Uritetapi masalahnya adalah gambar yang dimasukkan tidak muncul di galeri. Saya telah memeriksa baik di awal maupun di akhir galeri. Bisakah Anda menyarankan metode apa pun sehingga gambar yang disisipkan harus segera ditampilkan di galeri?
Shajeel Afzal
12

Penyegaran galeri termasuk 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())));
}
AtanuCSE
sumber
Kode yang ada di dalam kondisi pertama dengan pernyataan "IF" berfungsi dengan baik untuk saya di KitKat (Android 4.4.4, API 19).
Alex
8

Berikut adalah kode untuk MediaScannerConnection:

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

newfile adalah objek File dari file baru / tersimpan Anda.

3dmg
sumber
2
Terima kasih atas jawaban Anda. Sebenarnya, saya sudah lama menyelesaikan proyek ini ... Saya bahkan tidak ingat solusi apa yang saya gunakan. Pengguna lain mungkin menemukan solusi Anda berguna jika Anda juga menyediakan implementasi MyMediaConnectorClient...
Michael Kessler
ya - saya benar-benar sakit kepala dengan ini saat ini. Silakan posting :)
Steve
Ya, saya tidak begitu jelas tentang bagaimana seharusnya alurnya -Koreksi saya jika saya salah Saya dapat menggunakan MediaScannerConnection untuk memperbarui info SDCAARD jadi saya mengambil gambar dengan kamera dan meneruskan file baru ke MSC dan sekarang saya dapat mengakses file tersebut dengan klien pemindai koneksi?
Steve
Alurnya adalah: Anda mengambil gambar, menyimpannya ke sdcard Anda dan kemudian membuat pembaruan pemindai, sehingga sistem file diperbarui untuk melihat foto yang Anda simpan di galeri perangkat. Jika Anda tidak melakukannya dengan pemindai, Anda akan melihat foto Anda setelah perangkat berikutnya dimulai ulang di galeri.
3dmg
7

ada aplikasi di emulator yang bertuliskan - 'Dev Tools'

klik itu dan pilih 'Media Scanning' .. semua gambar akan dipindai

Abhishek Susarla
sumber
senang mengetahui, satu-satunya cara yang saya tahu sebelum Anda mengatakannya adalah dengan mereboot ponsel :)
mishkin
6

Biarkan aktivitas Anda mengimplementasikan 'MediaScannerConnectionClient' dan menambahkan ini ke aktivitas Anda:

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(); 
} 
TOMKA
sumber
Hai! Bagaimana jika kita mengetahui Urigambarnya, misalnya:content://media/external/images/media/1231778
Shajeel Afzal
6

ini bekerja dengan saya

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
pengguna3245604
sumber
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);
                        }
                    });
Khyati Fatania
sumber
Saya ingin menyimpan file gif animasi yang terletak di penyimpanan eksternal dan saya memiliki jalur yaitu / storage / emulated / 0 / Android / data / <PackageName> / files / <FolderName> /xyz.gif. Sekarang saya ingin menyimpan / menyalin file ini ke Galeri Gambar dan menunjukkannya di sana. Bagaimana cara melakukannya.
Zia Ur Rahman
3

Di sini saya membagikan kode yang dapat memuat gambar dalam bentuk bitmap dari dan menyimpan gambar itu di galeri sdcard di folder nama aplikasi. Anda harus mengikuti langkah-langkah ini

  1. Unduh Image Bitmap terlebih dahulu



     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. Berikan juga izin berikut di file AndroidManifest.xml Anda.


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


  1. Berikut ini seluruh kode yang tertulis di Activty tempat kami ingin melakukan tugas ini.



     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. Semoga ini bisa menyelesaikan seluruh masalah Anda.
VISHNU GARG
sumber
3
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

Sepertinya tidak berfungsi di KITKAT. Itu melempar pengecualian penolakan izin dan membuat aplikasi crash. Jadi untuk ini, saya telah melakukan hal berikut,

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

Semoga membantu.

Muhammad Riyaz
sumber
2

Gunakan ini setelah menyimpan gambar

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Deepu
sumber
3
Ini berfungsi tetapi itu bukan solusi terbaik. Anda mengelabui sistem dengan berpikir bahwa kartu SD akan dipasang (kembali) dan mungkin memaksa pemindaian ulang seluruh kartu SD. MediaScanner.scanFile (..) adalah solusi terbaik saat Anda sekarang ingin menambahkan file.
pocmo
1
Pencarian ini untuk semua gambar. Dan ini melibatkan banyak pemrosesan data yang tidak perlu yang mungkin tidak relevan ketika kita hanya memiliki satu gambar untuk ditampilkan di galeri.
Rahul Rastogi
2

Kode saya untuk 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();
    }
}
Marian
sumber
0

Anda perlu memberikan izin ke aplikasi Galeri. Cukup tekan lama ikon aplikasi galeri di layar beranda dan ketuk 'INFO APLIKASI' yang muncul di bagian atas layar. Setelah itu, pengaturan aplikasi galeri akan ditampilkan. Sekarang masuk ke tab Izin dan aktifkan penyimpanan, izin kamera dengan mengaktifkannya. Sekarang buka aplikasi galeri asli Anda dan Anda akan mendapatkan gambar yang disimpan.

Devanshu Jain
sumber
0

Ini juga akan menyelesaikan masalah Anda jika gambar Anda di galeri tidak muncul, tetapi gambar tersebut mungkin menampilkan bitmap tipe 404 di tengah. tolong tambahkan tag yang ada di kode saya dengan gambar Anda karena harus ada beberapa data meta untuk menampilkan gambar di galeri.

      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;
Mubashir Murtaza
sumber
0

Coba yang ini, itu akan menyiarkan tentang gambar baru yang dibuat, sehingga gambar Anda terlihat. di dalam galeri. photoFile diganti dengan jalur file sebenarnya dari gambar yang baru dibuat

private void galleryAddPicBroadCast() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri contentUri = Uri.fromFile(photoFile);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }
Anand Saggam
sumber