将位图保存到图库并通过本地通知访问它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将位图保存到图库并通过本地通知访问它相关的知识,希望对你有一定的参考价值。

在一个应用程序中,我正在截取页面内容的屏幕截图,我想将其保存在图库中,创建一个包含图像的本地通知,当用户点击它时,它会打开图像。画廊。

截至目前,我可以拍摄快照并使用以下方法保存:

var path = MediaStore.Images.Media.InsertImage(context.ContentResolver, bitmap, "TestImage.png", "Snapshot taken");

我对这种方法有一些问题,我可以在Gallery的Pictures文件夹中看到图像,但名称不是我在本例中指定的名称“TestImage.png”。此外,从此调用返回的路径具有URI方案“content:// ...”。

之后,我使用嵌入图像使用NotificationCompat.Builder创建本地通知,它运行良好。但是当我尝试将PendingIntent添加到它来打开图像时,我遇到了从InsertImage调用返回的路径的问题。返回的路径是:content:// media / external / images / media / 1292

我试过这个:

var path = FileProvider.GetUriForFile(CrossCurrentActivity.Current.AppContext, "com.myapp.fileprovider", new File(path));

但它不起作用,我得到一个例外:Java.Lang.IllegalArgumentException:找不到包含/ content的配置根:/ media / external / images / media / 1292

我也试过这个:

global::android.Net.Uri.FromFile(new File(path)), "image/*")

但我收到另一个例外:Android.OS.FileUriExposedException:file:/// content%3A / media / external / images / media / 1292通过Intent.getData()暴露在app之外

这是我用来创建通知的代码:

NotificationCompat.BigPictureStyle picStyle = new NotificationCompat.BigPictureStyle();
                picStyle.BigPicture(bitmap);
                picStyle.SetSummaryText("The snapshot has been saved to your library");

                const int pendingIntentId = 0;
                PendingIntent pendingIntent =
                    PendingIntent.GetActivity(CrossCurrentActivity.Current.Activity, pendingIntentId,
                        new Intent().SetAction(Intent.ActionView)
                            .SetDataAndType(global::Android.Net.Uri.FromFile(new File(path)), "image/*"), PendingIntentFlags.OneShot);
                NotificationCompat.Builder builder = new NotificationCompat.Builder(CrossCurrentActivity.Current.AppContext, "UniqueID")
                    .SetContentIntent(pendingIntent)
                    .SetContentTitle("Security center")
                    .SetContentText("The snapshot has been saved to your library")
                    .SetSmallIcon(Resource.Drawable.ic_notification);

                builder.SetStyle(picStyle);

                Notification notification = builder.Build();
                NotificationManager notificationManager =
                    CrossCurrentActivity.Current.Activity.GetSystemService(Context.NotificationService) as NotificationManager;
                const int notificationId = 0;
                notificationManager.Notify(notificationId, notification);

您是否知道我如何使用正确的名称在Public Gallery文件夹中保存图像然后在PendingIntent中访问本地通知?

谢谢你们 !

答案

好吧,经过几个小时的试验和错误后,我发现了问题,在解析从MediaStore.Images.Media.InsertImage返回的路径时,我不得不使用global :: Android.Net.Uri.Parse()而不是Uri.FromFile(),后者仅在您的路径具有URI方案“file://”时使用。通过这样做,我能够使ContentIntent在本地通知上工作。现在唯一的问题是不受尊重的文件的名称。

以上是关于将位图保存到图库并通过本地通知访问它的主要内容,如果未能解决你的问题,请参考以下文章

如何将位图添加到电话库?

React-native-android - 如何将图像保存到Android文件系统并在手机的“图库”中查看

将位图从片段保存到内部/外部存储[关闭]

如何从图库中选择图像并保存到 xamarin 中的 sql 数据库

如何将我生成的 QR 图像保存到图库中?使用颤振

如何在不将图像保存在本地的情况下将捕获的图像(Surface View)传递给另一个片段?