Как скачать фото с URL и сохранить в Xamarin - PullRequest
1 голос
/ 01 ноября 2019

Мне нужен Xamarin для вызова API GET, который загружает фотографию с URL-адреса и сохраняет ее в телефоне. Когда xamarin вызывает API, он загружает изображение с URL-адреса, а затем возвращает его в ответ на xamarin, после чего я сохраню фотографию в телефоне.

API - это C # 4.0 MVC. Я создал Get API, который успешно загружает изображение и возвращает его как FileStreamResult.

API загружает изображение из URL-адреса и возвращает его

public FileStreamResult DownloadFoto()
        {

            Stream rtn = null;
            string aURL = "https://image.shutterstock.com/image-vector/sample-stamp-grunge-texture-vector-260nw-1389188336.jpg";
            HttpWebRequest aRequest = (HttpWebRequest)WebRequest.Create(aURL);
            HttpWebResponse aResponse = (HttpWebResponse)aRequest.GetResponse();
            rtn = aResponse.GetResponseStream();
            return File(rtn, "image/jpeg", foto);
        }

Xamarin Forms HttpConnection является экземпляром HttpClient.

var Response = await Application.HttpConnection.GetAsync("DownloadFoto");
                        DependencyService.Get<IFileService>().SavePicture("ImageName.jpg", Response.Content.ReadAsStreamAsync().Result, "imagesFolder");

Xamarin Android

[assembly: Dependency(typeof(FileService))]
namespace Diario.Droid
{
    public class FileService : IFileService
    {
        public void SavePicture(string name, Stream data, string location = "temp")
        {
            var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            string filePath = Path.Combine(documentsPath, name);
            byte[] bArray = new byte[data.Length];
            using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
            {
                using (data)
                {
                    data.Read(bArray, 0, (int)data.Length);
                }
                int length = bArray.Length;
                fs.Write(bArray, 0, length);
            }
        }
    }
}

Я не получаю никакой ошибки, похоже, что я сохраняю изображение, но когда я ищу его в File Management, я не вижуизображение там.

1 Ответ

0 голосов
/ 01 ноября 2019

Да, путь к каталогу, который вы получаете:

var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);

Он указывает где-то в /data/user/, который будет закрыт для приложения. Если вы хотите сделать его доступным для просмотра с помощью приложения File Explorer, вам, вероятно, потребуется сохранить его где-нибудь во внешнем хранилище (общедоступном хранилище).

Вы можете получить путь для этого с помощью:

var externalDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments);

Если вы ориентируетесь на Android API 18 и ниже, не забудьте добавить разрешения для этого в свой AndroidManifest:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

Поскольку некоторые устройства на Android могут иметь свое внешнее хранилище на картах microSD, вы будетенеобходимо проверить, можете ли вы сначала написать в него:

var stateOk = Android.OS.Environment.ExternalStorageState == Android.OS.Environment.MediaMounted;
if (stateOk)
{
    // I can write!
}

Начиная с версии Android API 23 и выше, вам потребуется запросить разрешение, прежде чем вы сможете читать и записывать на внешнее хранилище. Вы можете использовать этот плагин, чтобы легко запрашивать разрешения: https://github.com/jamesmontemagno/PermissionsPlugin

Еще одна пара вещей, на которые стоит обратить внимание. Вы используете .Result для вашего ReadAsStreamAsync() вызова. Просто помните, что вы будете блокировать поток, на котором находитесь. Я настоятельно рекомендую вам разрабатывать свои методы так, чтобы они были полностью асинхронными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...