Xamarin的.插件形式.媒体GetStream/Dispose不存在

本文关键字:GetStream Dispose 不存在 媒体 插件 Xamarin | 更新日期: 2023-09-27 18:13:15

我尝试实现一个照片选择器从iOS/Android上的库/画廊获取照片,所以我使用Plugin。Media with Xamarin.Forms.

我使用了这个:https://github.com/jamesmontemagno/MediaPlugin

问题是函数GetStream()和Dispose()不存在,下面是确切的错误消息:

错误: 'Task'不包含'GetStream'的定义,并且无法找到接受'Task'类型的第一个参数的扩展方法'GetStream'(您是否缺少using指令或程序集引用?)

错误: 'Task'不包含'Dispose'的定义,并且无法找到接受'Task'类型的第一个参数的扩展方法'Dispose'(您是否缺少using指令或程序集引用?)

addphotos.Clicked = new Command(() => { 
    if (CrossMedia.Current.IsPickPhotoSupported)
    {
        if (!CrossMedia.Current.IsPickPhotoSupported)
        {
            DisplayAlert("Photos Not Supported", ":( Permission not granted to photos.", "OK");
            return;
        }
        var file = CrossMedia.Current.PickPhotoAsync();
        if (file == null)
            return;
        image.Source = ImageSource.FromStream(() =>
        {
            var stream = file.GetStream();
            file.Dispose();
            return stream;
        });
    }
});

Xamarin的.插件形式.媒体GetStream/Dispose不存在

您需要将lambda设置为async并等待对CrossMedia.Current.PickPhotoAsync:

的异步调用。
addphotos.Clicked = new Command(async () => { 
    if (CrossMedia.Current.IsPickPhotoSupported)
    {
        if (!CrossMedia.Current.IsPickPhotoSupported)
        {
            DisplayAlert("Photos Not Supported", ":( Permission not granted to photos.", "OK");
            return;
        }
        var file = await CrossMedia.Current.PickPhotoAsync();
        if (file == null)
            return;
        image.Source = ImageSource.FromStream(() =>
        {
            var stream = file.GetStream();
            file.Dispose();
            return stream;
        });
    }
});

PickPhotoAsync()是一个async方法,所以它返回一个Task,但是如果你等待它,它会返回你正在寻找的值。如果你还没有跟上异步和等待的速度,请查看微软指南:

https://msdn.microsoft.com/en-us/library/mt674882.aspx?f=255& MSPPError = -2147217396

顾名思义,PickPhotoAsync()是一个async函数,所以在调用它时需要使用await。

// file will be a Task<MediaFile>
var file = CrossMedia.Current.PickPhotoAsync();
// file will be a MediaFile
var file = await CrossMedia.Current.PickPhotoAsync();