Xamarin - скачать изображение в галерею - PullRequest
0 голосов
/ 20 марта 2020

Я нашел это: Как загрузить изображение и сохранить его в локальном хранилище, используя Xamarin-Forms.?

Это частично решает мою проблему, за исключением двух моментов:

  • Мне нужно загрузить изображение в галерею, а не путь к приложениям
  • Мне нужно, чтобы это работало для android и IOs. Кажется, это работает только для Android.

По сути, я знаю URL файла в Интернете, и мне нужно загрузить его в галерею. Было бы здорово, если бы я c смог «сохранить» его изнутри приложения вместо «загрузки». Было бы хорошо, если бы клиент не мог определить URL изображений, которые он хочет сохранить.

РЕДАКТИРОВАТЬ:

Теперь я использую FFImageLoading .. вот мой текущий (не работающий) код ..

 private async void SaveToGallery_Clicked(object sender, EventArgs e)
    {
        var img = await MyImage.GetImageAsJpgAsync(quality: 100);

        string fileName = uri.ToString().Split('/').Last();

        DependencyService.Get<IMediaService>().SaveImageFromByte(img, fileName);
    }

Android MediaService.cs

[assembly: Xamarin.Forms.Dependency(typeof(MediaService))]
namespace GalShare.Droid
{
public class MediaService : IMediaService
{
    Context CurrentContext => CrossCurrentActivity.Current.Activity;
    public void SaveImageFromByte(byte[] imageByte, string fileName)
    {
        try
        {

            Java.IO.File storagePath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures);
            string path = System.IO.Path.Combine(storagePath.ToString(), fileName);
            System.IO.File.WriteAllBytes(path, imageByte);
            var mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
            mediaScanIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(path)));
            CurrentContext.SendBroadcast(mediaScanIntent);
        }
        catch (Exception ex)
        {

        }
    }
}
}

Android MainActivity.cs:

namespace GalShare.Droid
{
[Activity(Label = "GalShare", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public int STORAGE_PERMISSION_CODE = 101;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        FFImageLoading.Forms.Platform.CachedImageRenderer.Init(enableFastRenderer: false);

        base.OnCreate(savedInstanceState);

        Forms.SetFlags("CollectionView_Experimental");

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        CachedImageRenderer.InitImageViewHandler();

        string fileName = "galleries.db3";
        string folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        string completePath = Path.Combine(folderPath, fileName);

        checkPermission("android.permission.write_external_storage", STORAGE_PERMISSION_CODE);

        LoadApplication(new App(completePath));
    }


    public void checkPermission(String permission, int requestCode)
    {
        var thisActivity = Android.App.Application.Context as Activity;
        // Checking if permission is not granted 
        if (ContextCompat.CheckSelfPermission(
                Android.App.Application.Context,
                permission)
            == Android.Content.PM.Permission.Denied)
        {
            RequestPermissions(new String[] { Manifest.Permission.WriteExternalStorage }, requestCode);

        }
        else
        {

        }

    }

}
}

1 Ответ

0 голосов
/ 21 марта 2020

Initialilzing CrossCurrentActivity в MainActivity.cs решил проблему:

CrossCurrentActivity.Current.Init(this, bundle);
...