有什么方法可以从位图创建 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 Bitmap
s - 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
场景:我在聊天应用程序中使用 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 Bitmap
s - 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