如何在应用程序中显示存储在移动设备中的图像?

时间:2019-03-22 11:01:08

标签: c# image xamarin xamarin.forms

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

1 个答案:

答案 0 :(得分:1)

要从content:// URI获取数据,可以使用ContentResolver。具体来说,您可以使用ContentResolver.OpenInputStreamsee here)从文件中加载内容。要显示图像,可以使用StreamImageSourcesee 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注入实例。

编辑2

由于出现了如何使用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进行编程,则必须注意可以从两个平台加载图像。