首页 > 解决方案 > 如何在我的应用程序上显示存储在移动设备中的图像?

问题描述

我有一个应用程序,有时我需要访问用户的联系人列表并从那里获取数据。为此,我使用Xamarin.Forms.Contacts(1.0.5)了插件并且效果很好。我能够Name Number Email PhotoUri PhotoUriThumbnail从每个联系人那里得到。然后我在我的应用程序中显示一些信息。但是,我无法显示PhotoUri目录中的图像。PhotoUri是具有这种格式的字符串 : content://android/...。我尝试转换PhotoUriImageSource然后在 xaml 文件上使用它,但没有任何效果......有人可以帮忙吗?

标签: c#imagexamarinxamarin.forms

解决方案


要从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仅适用于 , 。作为一种解决方法,我添加了一个静态属性InstanceMainActivity分配给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);

请注意:如果您正在为 iOSAndroid 编程,则必须注意可以从两个平台加载图像。


推荐阅读