代码之家  ›  专栏  ›  技术社区  ›  Michael Kessler

保存到SD卡的图像不会显示在Android的Gallery应用程序中。

  •  81
  • Michael Kessler  · 技术社区  · 14 年前

    我将图像保存到SD卡,在拔出SD卡并将其返回之前,它不会显示在Gallery应用程序中。

    你知道为什么吗?

    似乎Gallery应用程序有一些缓存在保存文件时未更新…

    实际上,我还想在Gallery应用程序中打开刚刚保存的图像,但没有成功。
    this 是我关于这个问题的问题。

    15 回复  |  直到 5 年前
        1
  •  41
  •   hackbod    14 年前

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

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

        2
  •  79
  •   darrenp David Hedlund    11 年前

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

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

    在哪里? this 是您的活动(或任何上下文),只有使用非标准文件扩展名和 null 是可选的回调(对于如此简单的情况,我们不需要)。

        3
  •  65
  •   ShadowGod    14 年前

    我对原始问题和其他可能有此问题的人的回答:

    我也遇到了同样的问题,我的应用程序中保存到SD卡上的图片不会立即显示在他们的图库中。经过一些搜索,我发现在我的“保存到SD卡”代码后插入的这一行代码解决了问题:

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
    
        4
  •  13
  •   Matt McMinn    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);
    
        5
  •  12
  •   AtanuCSE jpd    10 年前

    画廊更新,包括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())));
    }
    
        6
  •  8
  •   3dmg    14 年前

    以下是MediaScannerConnection的代码:

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

    new file是新/保存文件的文件对象。

        7
  •  7
  •   Abhishek Susarla    14 年前

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

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

        8
  •  6
  •   TOMKA    12 年前

    让您的活动实现“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(); 
    } 
    
        9
  •  5
  •   user3245604    9 年前

    和我一起工作

    File file = ..... // Save file
    
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
    
        10
  •  3
  •   VISHNU GARG    11 年前

    在这里,我共享的代码可以以位图的形式从SD卡库中加载图像,并将其保存在app name文件夹中的SD卡库中。 你应该遵循这些步骤

    1. 先下载图像位图
    
    
    
         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文件中提供以下权限。
    
    
        uses-permission android:name="android.permission.INTERNET" 
        uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    
    
    
    1. 下面是用Activity编写的完整代码,我们希望在其中执行此任务。
    
    
    
         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. 希望它能解决你的整个问题。
        11
  •  3
  •   Muhammad Riyaz    10 年前
    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
  •  3
  •   Khyati Vara    7 年前
     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);
                            }
                        });
    
        13
  •  2
  •   andrewsi Laxman Battini    12 年前

    保存图像后使用

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
    
        14
  •  2
  •   Raghav Satyadev    5 年前

    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();
        }
    }
    
        15
  •  0
  •   Devanshu Jain    6 年前

    您需要授予Gallery应用程序权限。 只需长按主屏幕上的Gallery应用程序图标,然后点击屏幕顶部弹出的“应用程序信息”。这样做将显示图库应用程序设置。现在进入“权限”选项卡,通过切换来启用存储、相机权限。 现在转到您的本地画廊应用程序,您将获得保存的图像。