c# - 如何在我的应用程序上显示存储在移动设备中的图像?
问题描述
我有一个应用程序,有时我需要访问用户的联系人列表并从那里获取数据。为此,我使用Xamarin.Forms.Contacts(1.0.5)
了插件并且效果很好。我能够Name Number Email PhotoUri PhotoUriThumbnail
从每个联系人那里得到。然后我在我的应用程序中显示一些信息。但是,我无法显示PhotoUri
目录中的图像。PhotoUri
是具有这种格式的字符串 : content://android/...
。我尝试转换PhotoUri
为ImageSource
然后在 xaml 文件上使用它,但没有任何效果......有人可以帮忙吗?
解决方案
要从content://
URI 获取数据,您可以使用ContentResolver
. ContentResolver.OpenInputStream
具体来说,您可以使用(参见此处)从文件中加载内容。要显示图像,您可以使用StreamImageSource
(参见此处)。鉴于您已经有一个Uri
,您可以实例化 ,StreamImageSource
如以下代码段所示
var contentResolver = Application.ApplicationContext.ContentResolver;
var streamImageSource = new StreamImageSource()
{
Stream = (cancellationToken) => Task.FromResult(contentResolver.OpenInputStream(uri));
}
请注意:如果PhotoUri
是源自Android.Net.Uri
您的注释,则必须将其转换为后者。
编辑
提供的代码MainActivity
仅适用于 , 。作为一种解决方法,我添加了一个静态属性Instance
,MainActivity
分配给OnCreate
public static MainActivity Instance { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
this.Window.RequestFeature(WindowFeatures.ActionBar);
this.SetTheme(Resource.Style.MainTheme);
base.OnCreate(savedInstanceState);
MainActivity.Instance = this;
// whatever
}
然后你可以使用
var contentResolver = MainActivity.Instance.Application.ApplicationContext.ContentResolver;
这可能不是最佳的,但有效。或者(我更喜欢)您可以将 注入MainActivity
您的实例。
编辑 2
由于问题出现了如何使用 Xamarin.Forms 中的此代码,因此我将给出一个简短的概述。如果您不使用依赖注入,最简单的方法是使用DependencyService
(参见此处)。在您的共享代码中创建一个接口
public interface IContentLoader
{
ImageSource LoadFromContentUri(Uri uri);
}
必须将这个接口的实现添加到平台项目中
[assembly: Dependency (typeof (Droid.ContentLoader))]
namespace Droid
{
public class ContentLoader : IContentLoader
{
public ImageSource LoadFromContentUri(Uri uri)
{
var contentResolver = MainActivity.Instance.Application.ApplicationContext.ContentResolver;
var streamImageSource = new StreamImageSource()
{
Stream = (cancellationToken) => Task.FromResult(contentResolver.OpenInputStream(Android.Net.Uri.Parse(uri.ToString())));
}
return streamImageSource;
}
}
}
现在IContentLoader
可以从您的 Xamarin.Forms 项目中使用DependencyService
:
var contentLoader = DependencyService.Get<IContentLoader>();
// ...
var imageSource = contentLoader.LoadFromContentUri(uri);
请注意:如果您正在为 iOS和Android 编程,则必须注意可以从两个平台加载图像。
推荐阅读
- python - python 3.9中的2 ^ 3 = 1怎么办
- gitlab-ci - 在 .gitlab-ci.yml 作业之间共享脚本
- javascript - 反应钩子 - 在按钮单击时获取事件对象和参数
- python - 如何获得适用于 sklearn 的日志损失指标的多标签(不是多类)分类?
- html - 在 Delphi 中比较日文 HTML 文本和日文字符串常量
- javascript - 如何将整个图像填充到很小的跨度中?
- docker - Logrotate: Docker + nginx. Can't reload nginx container (logrotate: ALERT exited abnormally with [1])
- verilog - Verilog:如何从 32 位移位器构建 64 位移位器(门级)
- python - 如何让我的 discord.py 机器人提及我的消息中提到的某人?
- java - 如何在 scala code whit tool jar 中获取关键信息?