保存为SD卡的图片不会出现在Android的图库应用中

Mic*_*ler 86 android image gallery save

我将图像保存到SD卡中,直到我拉出SD卡并将其返回后才会出现在Gallery应用程序中.

你知道为什么会这样吗?

看起来像Gallery应用程序有一些缓存没有更新文件保存...

实际上,我还想在Gallery应用程序中打开刚刚保存的图像并且没有成功,
是我对此问题的疑问.

dar*_*enp 83

一个更简单的解决方案是使用静态便捷方法scanFile():

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

this您的活动(或任何上下文)在哪里,只有在使用非标准文件扩展名时才需要mime-type,null而对于可选回调(仅我们不需要这么简单的情况),mime-type是必需的.

  • 发现,其他人(和谷歌)提供的广播方法很少有效. (2认同)
  • 这对于我在早期的Android版本~4.0中工作,但现在在4.3+似乎没有工作.图片未显示在图库应用中. (2认同)

Sha*_*God 65

我对原始问题的答案以及可能存在此问题的其他任何人:

我遇到了同样的问题,我的应用程序中保存到SD卡的图像没有立即显示在他们的图库中.经过一些搜索后,我发现在我的"保存到SD卡"代码后插入了一行代码来修复问题:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Run Code Online (Sandbox Code Playgroud)

  • Android 4.4或更高版本似乎不再支持此功能.在这种情况下,将抛出权限异常. (6认同)
  • 它可以帮助某人 - 更具体的路径:sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)))); 这个方法(这个答案,不仅仅是我的评论)在模拟器上不起作用.在真实设备上测试. (4认同)

hac*_*bod 44

系统在安装时扫描SD卡以查找任何新图像(和其他)文件.如果以编程方式添加文件,则可以使用此类:

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

  • 附注:虽然问题涉及文件添加,但MediaScannerConnection不提供文件删除解决方案 - 即使在请求扫描已删除文件的父文件夹时也是如此. (4认同)

Jan*_*usz 13

您还可以通过意图将图像添加到媒体库,查看示例代码以了解它是如何完成的:

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);
Run Code Online (Sandbox Code Playgroud)


Ata*_*CSE 12

画廊刷新包括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())));
}
Run Code Online (Sandbox Code Playgroud)


3dm*_*dmg 8

以下是MediaScannerConnection的代码:

MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();
Run Code Online (Sandbox Code Playgroud)

newfile是新/保存文件的File对象.

  • 谢谢您的回答。实际上,我很久以前已经完成了这个项目……我什至不记得我使用的解决方案是什么。如果您还提供MyMediaConnectorClient的实现,其他用户可能会发现您的解决方案很有帮助。 (2认同)

Abh*_*rla 7

模拟器中有一个应用程序说 - 'Dev Tools'

点击它并选择"媒体扫描"..所有图像都会被扫描


TOM*_*MKA 6

让您的活动实施'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(); 
} 
Run Code Online (Sandbox Code Playgroud)


小智 5

这项工作与我

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
Run Code Online (Sandbox Code Playgroud)


Khy*_*nia 5

 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);
                        }
                    });
Run Code Online (Sandbox Code Playgroud)