#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();