将位图图像保存到Android 10画廊的特定位置

12

我正在使用这段代码:

MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title" , "description");

它正在正常运作。

问题:

  1. 在相册中自动创建一个名为"Pictures"的文件夹。但是我想要不同的名称,例如我的应用程序名称。
  2. MediaStore的insertImage()函数在android 10中已经过时

public static String insertImage (ContentResolver cr, String imagePath, String name, String description)

此方法已从API级别29开始弃用。应使用MediaColumns#IS_PENDING执行图像插入,该选项提供了更丰富的生命周期控件。

我已阅读文档,实际上不理解IS_PENDING以及如何使用它。


你不想保存在画廊中,而是在媒体存储中查看你的代码。 - blackapps
在Android 10中,您只能将应用程序文件夹创建为“文档”、“下载”、“相机”、“图片”等目录的子目录。 - blackapps
1个回答

29

试试这段代码:

private void saveImage(Bitmap bitmap, @NonNull String name) throws IOException {
    boolean saved;
    OutputStream fos;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        ContentResolver resolver = mContext.getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + IMAGES_FOLDER_NAME);
        Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        fos = resolver.openOutputStream(imageUri);
    } else {
        String imagesDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM).toString() + File.separator + IMAGES_FOLDER_NAME;

        File file = new File(imagesDir);

        if (!file.exists()) {
            file.mkdir();
        }

        File image = new File(imagesDir, name + ".png");
        fos = new FileOutputStream(image);

    }

    saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.flush();
    fos.close();
}

1
你没有在Android 10中两次使用IS_PENDING。OP要求这样做。 - blackapps
@blackapps 禁用按钮是个好主意。但在这种情况下,按钮必须存在。我已经做了另一个快速修复,这里文件名是唯一的。所以,首先获取要保存的文件的名称。然后列出要保存的文件夹中的文件,并检查是否包含给定的文件名。如果没有,就保存它。你有其他建议吗? - mad_lad
让我们在聊天中继续这个讨论 - mad_lad
1
@Arjunsaini 这个方法需要WRITE_EXTERNAL_STORAGE权限吗? - M DEV
1
是的,对于Marshmallow及以上版本,您需要运行时权限。 - Arjun saini
显示剩余7条评论

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