在一个应用程序中,我正在截取页面内容的屏幕快照,我想将其保存在图库中,并在其中创建包含图像的本地通知,当用户点击它时,它会打开图片来自画廊。
到目前为止,我可以使用以下方法拍摄快照并保存它:
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中访问本地通知有任何想法吗?
谢谢大家!
答案 0 :(得分:0)
好吧,经过几个小时的反复试验,我解析出MediaStore.Images.Media.InsertImage返回的路径时发现了问题,我不得不使用global :: Android.Net.Uri.Parse( )而不是Uri.FromFile(),只有当您的路径具有URI方案“ file://”时,后者才有效。通过这样做,我能够使ContentIntent在本地通知上工作。现在唯一的问题是不受尊重的文件名。