我的意思是在某个时候我需要访问用户的联系人列表并从那里获取数据。为此,我使用了Xamarin.Forms.Contacts(1.0.5)
插件,并且效果很好。我能够从每个联系人那里得到Name Number Email PhotoUri PhotoUriThumbnail
。然后,我在我的应用程序上显示一些信息。但是,我无法显示PhotoUri
目录中的图像。 PhotoUri
是具有以下格式的字符串:content://android/...
。我尝试将PhotoUri
转换为ImageSource
,然后在xaml文件上使用它,但没有任何效果……任何人都可以帮忙吗?
答案 0 :(得分:1)
要从content://
URI获取数据,可以使用ContentResolver
。具体来说,您可以使用ContentResolver.OpenInputStream
(see here)从文件中加载内容。要显示图像,可以使用StreamImageSource
(see here)。假设您已经拥有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
注入实例。
由于出现了如何使用Xamarin.Forms中的代码的问题,我将简要介绍一下。如果您没有使用依赖注入,则最简单的方法是使用DependencyService
(请参见here)。在您的共享代码中创建一个界面
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进行编程,则必须注意可以从两个平台加载图像。