Xamarin - 将图像下载到图库

Posted

技术标签:

【中文标题】Xamarin - 将图像下载到图库【英文标题】:Xamarin - download image to gallery 【发布时间】:2020-03-20 20:19:03 【问题描述】:

我发现了这个:How to download image and save it in local storage using Xamarin-Forms.?

这部分解决了我的问题,除了两点:

我需要将图片下载到图库,而不是应用程序的路径 我需要它同时适用于 android 和 IO。这似乎只适用于 Android。

基本上我知道在线文件的 URL,并且需要将其下载到图库。如果 ic 可以从应用程序内部“保存”它,而不是“下载”,那就太好了。如果客户不知道他要保存的图像的 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
        

        

    



【问题讨论】:

下载文件与在任何 c# 应用程序中相同 - 使用 HttpClient 获取字节,然后使用 Sytem.IO.File 写入文件。有许多现有的问题可以解决这个问题。保存到图库在 ios 和 Android 之间会有所不同,但是关于 SO 存在多个现有问题来解释如何做到这一点。 @Jason 谢谢.. 我一直在环顾四周,发现了很多主题,但没有一个能给我带来解决方案。我用到目前为止的代码更新了主题。但是当我点击时没有发生,另外,路径不知何故与画廊不相符.. “不工作” - 这是什么意思?它有编译错误,还是在运行时崩溃并出现异常?它是否做(或不做)它不应该做的事情?正如我之前解释的,保存到图库将是特定于平台的操作。您是否查看过其他解决此问题的问题? @Jason,我做了一些巨大的改变,实现了权限请求,并且在安卓端工作。目前没有任何反应.. 文件根本没有保存.. 使用当前代码更新帖子 似乎是 null:` Context CurrentContext => CrossCurrentActivity.Current.Activity;` 在 mediaservice.cs 中 【参考方案1】:

在 MainActivity.cs 中初始化 CrossCurrentActivity 解决了这个问题:

CrossCurrentActivity.Current.Init(this, bundle);

【讨论】:

以上是关于Xamarin - 将图像下载到图库的主要内容,如果未能解决你的问题,请参考以下文章

扫描图库中的图像时,Xamarin.Forms ZXing BarcodeReaderGeneric 返回 null

Xamarin Android - 从图库中选择图像并获取其路径

如何调整 xamarin.forms 中的图像大小?

如何调整 xamarin.forms 中的图像大小?

Xamarin - 是不是有与适用于 Android 的 Photokit (iOS) 类似的框架,或者是获取图库中所有图像的文件流的好方法?

Xamarin.Forms - 页面缓存