Xamarin.Плагин Forms.Media GetStream / Dispose не существует

#c# #xamarin #xamarin.ios #xamarin.android #xamarin.forms

#c# #xamarin #xamarin.ios #xamarin.android #xamarin.формы

Вопрос:

Я пытаюсь реализовать средство выбора фотографий, чтобы получать фотографии из библиотеки / галереи на iOS / Android, поэтому я использовал плагин.Носители с помощью Xamarin.Формы.

Я использовал это: https://github.com/jamesmontemagno/MediaPlugin

Проблема в том, что функции GetStream() и Dispose() не существуют, вот точные сообщения об ошибках:

Ошибка: ‘Task’ не содержит определения для ‘GetStream’, и не удалось найти метод расширения ‘GetStream’, принимающий первый аргумент типа ‘Task’ (вам не хватает директивы using или ссылки на сборку?)

Ошибка: ‘Task’ не содержит определения для ‘Dispose’, и не удалось найти метод расширения ‘Dispose’, принимающий первый аргумент типа ‘Task’ (вам не хватает директивы 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;
        });
    }
});
 

Ответ №1:

Вам нужно сделать лямбда-код асинхронным и дождаться асинхронного вызова CrossMedia.Текущий.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() — это асинхронный метод, поэтому он возвращает задачу, но если вы ее ожидаете, она вернет искомое значение. Если вы не в курсе асинхронности и ожидаете, ознакомьтесь с руководством Microsoft по адресу:

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

Комментарии:

1. Большое спасибо, все прошло хорошо. Спасибо за ссылку, я проверю ее.

Ответ №2:

PickPhotoAsync(), как следует из названия, является асинхронной функцией, поэтому при ее вызове необходимо использовать await .

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

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