Изображение, сохраненное на SDCard, не отображается в приложении «Галерея» Android. - PullRequest
83 голосов
/ 31 января 2010

Я сохраняю изображение на SD-карте, и оно не появляется в приложении «Галерея», пока я не сниму SD-карту и не верну ее обратно.

У вас есть идеи, почему это так?

Похоже, что приложение Галерея имеет некоторый кеш, который не обновляется при сохранении файла ...

На самом деле, я также хочу открыть только что сохраненное изображение в приложении "Галерея", но у меня ничего не вышло.
это - мой вопрос об этой проблеме.

Ответы [ 15 ]

80 голосов
/ 05 ноября 2013

Более простое решение - использовать статический удобный метод scanFile () :

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

, где this - ваша активность (или любой другой контекст), mime-тип необходим только в том случае, если вы используете нестандартные расширения файлов, а null - для дополнительного обратного вызова (который нам не нужен такой простой случай).

65 голосов
/ 27 сентября 2010

Мой ответ на оригинальный вопрос и всем, у кого может быть эта проблема:

У меня возникла такая же проблема, изображения в моем приложении, которые люди сохраняли на SD-карту, не сразу появлялись в их Галерее. После некоторых поисков я обнаружил одну строку кода, вставленную после кода «save to sdcard», который устранил проблему:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
42 голосов
/ 31 января 2010

Система сканирует SD-карту, когда она смонтирована, чтобы найти любые новые файлы изображений (и другие). Если вы программно добавляете файл, то вы можете использовать этот класс:

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

13 голосов
/ 27 сентября 2010

Вы также можете добавить изображение в галерею мультимедиа намеренно, посмотрите на пример кода, чтобы увидеть, как это делается:

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);
12 голосов
/ 12 июня 2014

Обновление галереи, включая 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())));
}
8 голосов
/ 08 марта 2010

Вот код для MediaScannerConnection:

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

newfile - это объект File вашего нового / сохраненного файла.

7 голосов
/ 10 декабря 2010

в эмуляторе есть приложение с надписью "Dev Tools"

нажмите на это и выберите «Сканирование мультимедиа» .. все изображения будут отсканированы

6 голосов
/ 01 февраля 2012

Позвольте вашей деятельности реализовать MediaScannerConnectionClient и добавьте это к своей деятельности:

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(); 
} 
5 голосов
/ 13 июля 2015

это работа со мной

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
3 голосов
/ 25 мая 2017
 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);
                        }
                    });
...