Формы Xamarin: как получать изображения, не сохраняя нигде локально?

#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 Да, они будут временными, но если изображение содержит конфиденциальные данные, это может стать дырой в безопасности. Но в любом случае, я бы никогда не стал хранить конфиденциальные данные в любом случае, единственный законный случай для этого, который я могу придумать, — это сканы документов или изображения медицинских данных.