#c# #android #ios #xamarin #xamarin.forms
#c# #Android #iOS #xamarin #xamarin.forms
Вопрос:
Я работаю над приложением, в котором я хочу, чтобы пользователи получали изображения из веб-службы, но не хотят, чтобы они хранились локально в localdb или локальных файлах. Есть ли способ сделать это?
Я использую формы Xamarin.Но если это можно сделать изначально, это также можно сделать с помощью xamarin forms.
Комментарии:
1. Передавайте их в виде массивов байтов / потоков памяти…..
2. не могли бы вы уточнить, пожалуйста?
Ответ №1:
Вы всегда можете загрузить изображение в виде файла, используя webclient, а затем StreamImageSource.
Во-первых, вам нужен интерфейс для службы зависимостей (я предпочитаю использовать WebClient, чем любую стороннюю библиотеку, поэтому я использую эти службы, не стесняйтесь использовать что-нибудь еще, если вам это нравится, просто пропустите служебную часть), созданный в проекте Forms:
public interface IDownloader
{
byte[] Download(string Url);
}
Затем вам нужна служба зависимостей в проекте Android:
[assembly: Dependency ( typeof (--yournamespace--.Downloader))]
public class Downloader : IDownloader
{
public byte[] Download(string Url)
{
//This code is synchronous, I would recommend to do it asynchronously
WebClient wc = new WebClient();
return wc.DownloadData(Url);
}
}
А затем вы можете загрузить изображение и установить его в качестве исходного:
//I assume there exist an image control called img.
var dl = DependencyService.Get<IDownloader> ();
byte[] data = dl.Download(--url to the image--);
var ms = new MemoryStream(data);
img.Source = new StreamImageSource{ Source = (t) => ms };
Комментарии:
1. Если мы последуем этой процедуре и установим источник изображения в качестве потока памяти, изображения нигде не будут сохранены на устройстве правильно?
2. Да, Xamarin просто использует поток для создания растрового изображения Android, и все это делается в памяти.
3. Применимо ли то же самое к iOS?
4. Я так думаю, но не уверен на 100%, может ли iOS (сама ОС) кэшировать изображения.
5. Я перепроверю это. Но спасибо. Ваш ответ был большой помощью. Я пытаюсь опубликовать другой вопрос, касающийся отключения функции скриншотов на iOS, я знаю, что это можно сделать на Android, но можно ли это также сделать на iOS?
Ответ №2:
Вы не указываете, подключены вы к Сети или нет — если вы подключены к Сети, вы можете просто использовать URL в XAML для форм Xamarin, например:
<Image HeightRequest="50" WidthRequest="50" HorizontalOptions="Center" VerticalOptions="Center" Source="{Binding UserAvatarURL}"/>
И формы справятся с этим.
Комментарии:
1. если мы передадим URL-адрес в ‘UserAvatarURL’, он будет отображаться пользователю, но нигде не будет сохранен локально или в каких-либо временных файлах?
2. В приведенном выше случае это поле с привязкой к базе данных, поэтому фактический текст будет заменен реальным URL в моей модели просмотра, например. example.com/image.png — если вы хотите заменить привязку, чтобы попробовать это, используйте что-то вроде этого (очевидно, замените URL-адрес реальным): <Запрос высоты изображения=»50″ WidthRequest=»50″ HorizontalOptions=»Center» VerticalOptions=»Center» Source=» example.com/pic.png » >
3. Возможно, они будут сохранены во временном файле, но ОС удалит их. Другой вариант — загрузить файл в массив памяти и установить imagesource в MemoryStream, используя этот массив
4. @Gusman да, я думал, что проблема op заключалась в том, что нужно было самостоятельно выполнять сохранение для локальной работы, но вы правы, возможно, я делаю ложное предположение, и изображения все еще кэшируются локально, хотя они кажутся очень временными.
5. @RussellYoung Да, они будут временными, но если изображение содержит конфиденциальные данные, это может стать дырой в безопасности. Но в любом случае, я бы никогда не стал хранить конфиденциальные данные в любом случае, единственный законный случай для этого, который я могу придумать, — это сканы документов или изображения медицинских данных.