有什么方法可以从位图创建 Uri 但我不想在图片库中看到它吗?

Is there any way to create Uri from bitmap but i don't want to see it in image gallery?

场景:我在聊天应用程序中使用 MessagingStyle 通知。对于图像消息,我使用 setData 函数以对话方式创建图像通知。

public Message setData(String dataMimeType, Uri dataUri)

此方法需要 dataUri,但我有 URL 个图像,因此我从图像 url 创建了一个位图,然后使用下面的函数从 batmap 创建了一个 uri。

public static Uri getImageUri(Context applicationContext, Bitmap photo) {
    try {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(applicationContext.getContentResolver(), photo, "IMG_" + Calendar.getInstance().getTime(), null);
        if (path == null) {
            return null;
        }
        return Uri.parse(path);
    } catch (SecurityException ex) {
        ex.printStackTrace();
        return null;
    }
}

问题:现在的问题是,当用户打开图片库时,会显示这些通知图片,因为我使用 mediastore 创建 URI。我不希望这些图片显示在图库中。

限制:我还保存了该 URI,以防万一我必须再次生成此通知。所以我不能立即删除该图像以避免在画廊中显示。

问题:有什么方法可以将图像私密地保存在画廊无法访问的外部存储中。但是通知管理器可以访问?

有什么方法可以在不下载的情况下创建 Uri 表单 url 吗?我已经试过了,但它也不起作用

url = new URL(messageNotification.getAttachmentImage());
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
imageUri=  Uri.parse(uri.toString());

另一种解决方法是使用像 WhatsApp 中的对话一样的消息样式在通知中显示图像

store your bitmap as File in some app-specific directory (not gallery) and make URI from file path. be aware of Scoped Storage and pick proper place for storing Bitmaps - check out in HERE,可能 getFilesDir()/getCacheDir() 方法是最好的选择

也值得尝试的可能是这一行:

Uri uri =  Uri.parse(messageNotification.getAttachmentImage());

(可能需要encodedImageUrl = URLEncoder.encode(imageUrl, "utf-8")

将图像直接从 url 下载到 getExternalFilesDir() 中的文件。不要使用中间位图。

MediaStore 无权访问您的 getExternalFilesDir(),因此图库应用不知道您那里的文件。

用户仍然可以使用“文件”应用查看这些图像。

然后使用 FileProvider 来提供您的文件。使用 FileProvider.getUriForFile().

构造一个 uri