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

时间:2019-02-06 17:44:17

标签: xamarin.forms xamarin.android

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

到目前为止,我可以使用以下方法拍摄快照并保存它:

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

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

之后,我使用带嵌入式图像的NotificationCompat.Builder创建本地通知,它运行良好。但是,当我尝试向其添加PendingIntent以打开图像时,我从InsertImage调用返回的路径存在问题。返回的路径是: 内容:// 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:通过Intent.getData()在应用之外公开的file:/// content%3A / media / external / images / media / 1292

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

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);

你们对我如何在公共画廊文件夹中保存具有正确名称的图像然后在PendingIntent中访问本地通知有任何想法吗?

谢谢大家!

1 个答案:

答案 0 :(得分:0)

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