如何在Android Q及更高版本中保存位图?

mtb9vblg  于 2022-12-09  发布在  Android
关注(0)|答案(2)|浏览(151)

在我的应用程序中,我必须将一个位图以PNG文件的形式存储在共享内存中,以使其在Gallery应用程序中可见。首先,我尝试将图像存储在/Android/data/package.name/files/Pictures中。我从context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)中获得了此路径。存储在此目录中的图像不会被Gallery检测到。然后,我阅读了一些关于MediaStore的文章和帖子,并尝试将图像与它一起保存。
这是一个我用来存储位图的函数。它不抛出任何异常,返回true,bitmap.compress()也返回true,但我在设备内存中找不到任何PNG图像。我尝试使用图库和文件管理器查找它。我还尝试将它改为保存JPEG而不是PNG,但它也不起作用。
你能帮我找出为什么这个功能不保存图像到设备的存储?
我在三星A52s 5G、安卓12、OneUI 4.0上进行了测试。

private boolean saveImageToStorageAndroidQ(Bitmap bitmap, String filename) {
    filename = filename + ".png";
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);

    final ContentResolver resolver = getActivity().getContentResolver();
    final Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    Uri uri = resolver.insert(contentUri, values);

    try {
        OutputStream imageOutStream = resolver.openOutputStream(uri);
        bitmap.compress(Bitmap.CompressFormat.PNG, 95, imageOutStream);
        imageOutStream.flush();
        imageOutStream.close();
        return true;
    } catch (Exception e) {
        return false;
    } finally {
        if (uri != null)
            resolver.delete(uri, null, null);
    }
}
7nbnzgx9

7nbnzgx91#

你也可以使用这个方法。虽然它很长,但由于other one已经被弃用,所以它更好。使用以下代码:

String filename = "name.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}
nzk0hqpo

nzk0hqpo2#

你可以使用一个非常简单的方法:

MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, filename, "Description");

此选项已过时。请尝试this答案

相关问题