保存为SD卡的图片未显示在Android Gallery应用中

时间:2010-01-31 01:41:00

标签: android image save gallery

我将图像保存到SD卡中,直到我取下SD卡并将其还原后才会出现在图库应用程序中。

你知道为什么会这样吗?

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

实际上,我还想在图库应用中打开刚刚保存的图片但没有成功,因为this是我对此问题的疑问。

17 个答案:

答案 0 :(得分:80)

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

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

其中this是您的活动(或任何上下文),只有在使用非标准文件扩展名且null用于可选回调时才需要mime类型(我们不要不需要这么简单的案例。)

答案 1 :(得分:65)

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

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

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

答案 2 :(得分:42)

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

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

答案 3 :(得分: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);

答案 4 :(得分: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())));
}

答案 5 :(得分:8)

以下是MediaScannerConnection的代码:

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

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

答案 6 :(得分:7)

模拟器中有一个应用程序说 - “开发工具”

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

答案 7 :(得分: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(); 
} 

答案 8 :(得分:4)

这项工作与我合作

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

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

答案 9 :(得分:3)

我在这里共享可以从位图形式加载图像的代码,并将该图像保存在应用程序名称文件夹中的sdcard库中。  您应该按照以下步骤进行操作

  1. 首先下载图片位图
  2. 
    
    
         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. 请在AndroidManifest.xml文件中提供以下权限。
    2. 
      
          uses-permission android:name="android.permission.INTERNET" 
          uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
      
      
      
      1. 这是用Activty编写的整个代码,我们要在其中执行此任务。
      2. 
        
        
             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. 希望它可以解决你的整个问题。

答案 10 :(得分:3)

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

答案 11 :(得分:3)

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

似乎不适用于KITKAT。 会抛出权限拒绝异常并导致应用崩溃。 所以为此,我做了以下工作,

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

希望它有所帮助。

答案 12 :(得分:2)

保存图像后使用此功能

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

答案 13 :(得分:2)

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

答案 14 :(得分:0)

您需要授予Gallery应用的权限。 只需长按主屏幕中的图库应用程序图标,然后点击屏幕顶部弹出的“APP INFO”。这样做会显示图库应用设置。现在进入权限选项卡,通过切换来启用存储,摄像机权限。 现在转到您的原生图库应用,您将获得已保存的图像。

答案 15 :(得分:0)

如果图库中的图像没有显示,而它们可能在中部显示404类型的位图,则这也可以解决您的问题。 请在您的图片中添加我代码中的标签,因为必须有一些元数据才能在图库中显示图片。

var credentials = {
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./cert.pem')
};

const server = https.createServer(credentials, (req, res) => {...})

答案 16 :(得分:0)

尝试此操作,它将广播有关创建的新图像的信息,因此您的图像可见。在画廊内。 photoFile 替换为新创建图像的实际文件路径

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