Изображение не отображается в галерее после загрузки - PullRequest
0 голосов
/ 28 января 2020

Я занимаюсь разработкой приложения Xamarin, которое извлекает информацию из БД, берет / выбирает фотографии и загружает их на удаленный сервер, отображает эти изображения с удаленного сервера, и пользователь может удалить их, коснувшись, нажав кнопку и загрузив изображения. с удаленного сервера на локальное устройство.

Все работает без проблем, но когда я загружаю изображение и после того, как я go в галерею для проверки, изображение не появляется, тогда как я вижу его и открываю в проводнике файлов. Когда я перезагружаю телефон, изображение появляется в галерее.

Ниже моего текущего способа загрузки кнопки :

private void button_download_image_Clicked(object sender, EventArgs e)
{

    Uri image_url_format = new Uri(image_url);
    WebClient webClient = new WebClient();
    try
    {
        byte[] bytes_image = webClient.DownloadData(image_url_format);
        Stream image_stream = new MemoryStream(bytes_image);
        string dest_folder = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).ToString();
        string file_name = System.IO.Path.GetFileName(image_url_format.LocalPath);
        string dest_path = System.IO.Path.Combine(dest_folder, file_name);
        using (var fileStream = new FileStream(dest_path, FileMode.Create, FileAccess.Write))
        {
            image_stream.CopyTo(fileStream);
        }
    }
    catch (Exception ex)
    {
        DisplayAlert("Error", ex.ToString(), "OK");
    }
        DisplayAlert("Alert", "Download completed!", "OK");
}

Я пробовал на другом устройстве, но получил такое же поведение.

Вероятно, есть какая-то вещь, которая не ссылается на sh галерею.

Любая идея, как заставить галерею обновить sh или что-то подобное?

Ответы [ 4 ]

1 голос
/ 28 января 2020

Вам необходимо обновить sh свою галерею после вставки или удаления любых изображений в хранилище.

Вы можете попробовать это.

            var mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
            mediaScanIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(dest_path)));
            Xamarin.Forms.Forms.Context.SendBroadcast(mediaScanIntent);

Добавьте эти строки под своим кодом. Сделать это как

private void button_download_image_Clicked(object sender, EventArgs e)
{
Uri image_url_format = new Uri(image_url);
WebClient webClient = new WebClient();
try
{
    byte[] bytes_image = webClient.DownloadData(image_url_format);
    Stream image_stream = new MemoryStream(bytes_image);
    string dest_folder = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).ToString();
    string file_name = System.IO.Path.GetFileName(image_url_format.LocalPath);
    string dest_path = System.IO.Path.Combine(dest_folder, file_name);
    using (var fileStream = new FileStream(dest_path, FileMode.Create, FileAccess.Write))
    {
        image_stream.CopyTo(fileStream);
    }
    var mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
    mediaScanIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(dest_path)));
    //for old xamarin forms version
    Xamarin.Forms.Forms.Context.SendBroadcast(mediaScanIntent);
    //for new xamarin forms version
    //Android.App.Application.SendBroadcast(mediaScanIntent);
}
catch (Exception ex)
{
    DisplayAlert("Error", ex.ToString(), "OK");
    return;
}
    DisplayAlert("Alert", "Download completed!", "OK");  
}
0 голосов
/ 28 января 2020

См. Ответ Blu ,

Я изменил Xamarin.Forms.Forms.Context.SendBroadcast(mediaScanIntent); на Android.App.Application.Context.SendBroadcast(mediaScanIntent); и все работает.

0 голосов
/ 28 января 2020

Убедитесь, что необходимые разрешения даны на обеих платформах.

Используйте в своем классе:

 bool success = await DependencyService.Get<IPhotoLibrary>().SavePhotoAsync(data, folder, filename);

Общий интерфейс

  public interface IPhotoLibrary
    {
        Task<bool> SavePhotoAsync(byte[] data, string folder, string filename);
    }

В Android услуга

  public async Task<bool> SavePhotoAsync(byte[] data, string folder, string filename)
        {
            try
            {
                File picturesDirectory = Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures);
                File folderDirectory = picturesDirectory;

                if (!string.IsNullOrEmpty(folder))
                {
                    folderDirectory = new File(picturesDirectory, folder);
                    folderDirectory.Mkdirs();
                }

                using (File bitmapFile = new File(folderDirectory, filename))
                {
                    bitmapFile.CreateNewFile();

                    using (FileOutputStream outputStream = new FileOutputStream(bitmapFile))
                    {
                        await outputStream.WriteAsync(data);
                    }

                    // Make sure it shows up in the Photos gallery promptly.
                    MediaScannerConnection.ScanFile(MainActivity.Instance,
                                                    new string[] { bitmapFile.Path },
                                                    new string[] { "image/png", "image/jpeg" }, null);
                }
            }
            catch (System.Exception ex)
            {
                return false;
            }

            return true;
        }

В сервисе iOS:

public Task<bool> SavePhotoAsync(byte[] data, string folder, string filename)
        {
            NSData nsData = NSData.FromArray(data);
            UIImage image = new UIImage(nsData);
            TaskCompletionSource<bool> taskCompletionSource = new TaskCompletionSource<bool>();

            image.SaveToPhotosAlbum((UIImage img, NSError error) =>
            {
                taskCompletionSource.SetResult(error == null);
            });

            return taskCompletionSource.Task;
        }

вы также можете обратиться к нему только для того, чтобы сохранить изображение и отразить его в средствах массовой информации, для этого не нужно использовать Skiasharp. https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/graphics/skiasharp/bitmaps/saving

Надеюсь, что это может решить вашу проблему.

0 голосов
/ 28 января 2020

Вам нужно просто обновить sh файл, который вы скачали. Это полезно.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);
            this.sendBroadcast(mediaScanIntent);
    }else{
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...