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.


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


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


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

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

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

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.


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


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

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

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

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.

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.


2

Gunakan ini setelah menyimpan gambar

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

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

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.


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;

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);
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.