Android - 为什么我保存的图片没有出现在我手机的默认图库中?

Tia*_*ago 4 storage android image internal save

我正在尝试将应用程序中的图像保存到手机的默认图库中。如果我的手机上有 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;
  }
Run Code Online (Sandbox Code Playgroud)

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

uriOfSucessfulySavedImage = c.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, v);
Run Code Online (Sandbox Code Playgroud)

然而,有趣的是,该变量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;
}
Run Code Online (Sandbox Code Playgroud)

并从以下代码中获取建立SD 卡的情况

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

    File fileCacheDir = null;

        fileCacheDir = context.getCacheDir();

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

    return fileCacheDir;
}
Run Code Online (Sandbox Code Playgroud)

hen*_*000 6

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

  • 我刚刚重启了手机。我之前保存在内部存储器中的所有图像现在都显示在图库中!所以,这肯定与您发布的媒体扫描仪有关。谢谢!稍后我将编写一些代码来扫描媒体并发布解决方案。 (2认同)

Laz*_*nja 6

另一种简单的方法来做到这一点。保存文件后添加此项。

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