安卓 - 为什么我的保存的图片没有出现在手机默认相册中?

5
我正在尝试将应用程序中的图像保存到手机默认相册。如果手机上有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);

然而,有趣的是变量uriOfSuccessfulSavedImage不是null(它返回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;
}

5个回答

8
另一个简单的方法是保存文件后添加以下内容。
File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);

6

我没有尝试过,但是我认为你需要运行媒体扫描器来扫描内部存储目录,这样相册就可以看到你新保存的图像了。在这里查看此帖子


谢谢Henry。我会尝试一下。 - Bitcoin Cash - ADA enthusiast
2
我刚刚重启了手机。之前保存在内部存储中的所有图像现在都显示在画廊中!所以,这肯定与您发布的媒体扫描器有关。谢谢!稍后我会编写一些代码来扫描媒体并发布解决方案。 - Bitcoin Cash - ADA enthusiast
1
太棒了! 它起作用了! 我刚刚使用了你引用的那篇文章中的SingleMediaScanner类。 非常感谢Henry! - Bitcoin Cash - ADA enthusiast

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

像冠軍一樣運作。 - amoljdv06

0

试试这个。

当图片存储在图库中时,将此行写下。

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接