【问题标题】:Android - Why my saved image is not appearing in the default gallery of my phone?Android - 为什么我保存的图像没有出现在手机的默认图库中?
【发布时间】:2012-07-18 23:46:45
【问题描述】:

我正在尝试将应用程序中的图像保存到手机的默认图库中。如果我的手机上有 SD 卡,下面的代码可以完美运行。正如预期的那样,保存的图像会出现在手机的图库和所有内容中:

private Uri saveMediaEntry(File f, String title, String description, int orientation,      Location loc) {

    ContentValues v = new ContentValues();
    v.put(Images.Media.TITLE, title);
    v.put(Images.Media.DISPLAY_NAME, title);
    v.put(Images.Media.DESCRIPTION, description);

    v.put(Images.Media.ORIENTATION, orientation);

    String nameFile = f.getName();
    File parent = f.getParentFile() ;
    String path = parent.toString().toLowerCase() ;
    String nameParent = parent.getName().toLowerCase() ;
    v.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
    v.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, nameParent);
    v.put(Images.Media.SIZE,f.length()) ;

    if( nameFile.toLowerCase().contains(".png") ){
        v.put(Images.Media.MIME_TYPE, "image/png");

    }else if( nameFile.toLowerCase().contains(".jpg") || 
              nameFile.toLowerCase().contains(".jpeg") ){
         v.put(Images.Media.MIME_TYPE, "image/jpeg");

    }else{
        v.put(Images.Media.MIME_TYPE, "image/jpeg");
    }

    String imagePath = f.getAbsolutePath();
    v.put("_data", imagePath) ;
    ContentResolver c = getContentResolver() ;

    Uri uriOfSucessfulySavedImage = null;
    uriOfSucessfulySavedImage = c.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, v);

    return uriOfSucessfulySavedImage;
  }

但是,如果我尝试将相同的图像保存到内部存储中(当手机没有 SD 卡时),图像不会出现在手机的图库中!为此,我只更改了上述代码中的一行:

uriOfSucessfulySavedImage = c.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, v);

然而,有趣的是变量uriOfSucessfulySavedImage 不为空(它返回content://media/internal/images/media/x,其中'x' 是一个数字)。因此,图像被保存在手机内部存储中的某个位置,但它没有像我使用 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 时那样显示在手机图库中。

有人知道发生了什么吗?如何将图像保存到手机的内部存储并将该图像保存在手机的图库中

更新

我忘记了一项重要信息。 "saveMediaEntry" 方法的参数中的文件“f”来自另一种方法,用于挂载 SD 卡时(即第一个代码):

public static File getCacheDirectory(String desiredNameOfTheDirectory){

File fileCacheDir = null;

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ){

        fileCacheDir = new File( Environment.getExternalStorageDirectory(), desiredNameOfTheDirectory );
   }


    if(!fileCacheDir.exists()){
        fileCacheDir.mkdirs();
    }

    return fileCacheDir;
}

以及从以下代码了解 SD 卡何时创建:

public static File getCacheDirectory(String desiredNameOfTheDirectory, Context   context){

    File fileCacheDir = null;

        fileCacheDir = context.getCacheDir();

    if(!fileCacheDir.exists()){
        fileCacheDir.mkdirs();
    }

    return fileCacheDir;
}

【问题讨论】:

标签: android image save storage internal


【解决方案1】:

另一种简单的方法。保存文件后添加。

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

【讨论】:

    【解决方案2】:

    我还没有尝试过,但我相信您需要运行媒体扫描仪来扫描内部存储目录,以便图库可以看到您新保存的图像。在这里查看post

    【讨论】:

    • 谢谢亨利。我会试试看。
    • 我刚刚重启了手机。我之前保存在内部存储中的所有图像现在都显示在图库中!因此,它肯定与您发布的这个媒体扫描仪有关。谢谢!稍后我将编写一些代码来扫描媒体并发布解决方案。
    • 太棒了!有效!我刚刚使用了您引用的那篇文章的 SingleMediaScanner 类。非常感谢亨利!
    【解决方案3】:

    在你的Activity中复制过去这个函数

    private void scanner(String path) {
    
            MediaScannerConnection.scanFile(FrameActivity.this,
                    new String[] { path }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
    
                        public void onScanCompleted(String path, Uri uri) {
                            Log.i("TAG", "Finished scanning " + path);
                        }
                    });
        }
    

    然后在保存图片的位置添加这一行

    scanner(imageFile.getAbsolutePath());
    

    【讨论】:

    • 像冠军一样工作
    【解决方案4】:

    试试这个。

    一旦图像存储在图库中,请记下这一行。

    File file = ..... // Save file
    
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
    

    【讨论】:

      【解决方案5】:
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      
                      sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                              Uri.parse("file://"
                                      + Environment.getExternalStorageDirectory())));
                  } else {
                      sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                              Uri.parse("file://"
                                      + Environment.getExternalStorageDirectory())));
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 2020-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多