【问题标题】:Imagecropper plugin is saving image in cache folder. how to save in gallery folder?Imagecropper 插件正在将图像保存在缓存文件夹中。如何保存在图库文件夹中?
【发布时间】:2021-08-12 04:51:07
【问题描述】:

我正在使用图像裁剪器插件来捕获图片并裁剪它。然后我使用 Xamarin.MediaGallery 插件将该照片保存在手机的图库文件夹中

ImageCropping.Form 参考:https://github.com/stormlion227/ImageCropper.Forms Xamarin.GalleryImage 参考:https://github.com/dimonovdd/Xamarin.MediaGallery

错误: **System.ArgumentException:** 'filePath'

在线 MediaGallery.SaveAsync(MediaFileType.Image, FullPath.ToString());

效果很好,但唯一的问题是默认情况下,它将图像保存在cache 文件夹中。当我尝试使用第二个插件保存在画廊文件夹中时,我得到一个错误

            //Use ImageCropping.Form to take a photo & Crop
            new ImageCropper()
            {
                PageTitle = "Crop Photo",
                AspectRatioX = 5, 
                CropShape = ImageCropper.CropShapeType.Rectangle,
                SelectSourceTitle = "Select source", 
                TakePhotoTitle = "Take Photo",        
                PhotoLibraryTitle = "Photo Library", 
                Success = (imageFile) =>
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        //Step#0: ImageCropping.Form, by defaults, saves the image to the following path & gives it a random name:
                        // /data/user/0/com.companyname.appname/cache/cropped296.png
                        
                        //Step#1: Get image full path from step#0
                        var FullPath = ImageSource.FromFile(imageFile);

                        //Step#2: Save in Gallery folder
                        MediaGallery.SaveAsync(MediaFileType.Image, FullPath.ToString());
                    });
                }
            }.Show(this);

更新:

android - MainAcivity.cs

 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

             NativeMedia.Platform.Init(this, savedInstanceState);
            CrossFingerprint.SetCurrentActivityResolver(() => Platform.CurrentActivity);
            Stormlion.ImageCropper.Droid.Platform.Init();
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        protected override void OnActivityResult(int requestCode, Result resultCode, Intent intent)
        {
            if (NativeMedia.Platform.CheckCanProcessResult(requestCode, resultCode, intent))
                NativeMedia.Platform.OnActivityResult(requestCode, resultCode, intent);

            Stormlion.ImageCropper.Droid.Platform.OnActivityResult(requestCode, resultCode, intent);

            base.OnActivityResult(requestCode, resultCode, intent);
            
    }

【问题讨论】:

  • 您是否有权限在手机中存储文件?
  • 是的,它将照片保存在缓存文件夹中,而不是画廊文件夹
  • 嗯,你调试过它并查看它用于 FullPath 的路径吗?
  • FullPath 对我来说是/data/user/0/com.companyname.appname/cache/cropped296.png 完全正确,但在某些地方显然我错了
  • 我有点困,所以我希望我能正确阅读代码。显示给客户端的图像实际上是现在通过缓存在其硬盘驱动器上的图像。当您执行 ImageSouce.FromFile(imageFille) 时,您实际上只是获取了该本地复制图像的路径,这是他们的缓存......并且您将其存储在同一个地方。

标签: c# android xamarin xamarin.forms mobile


【解决方案1】:

现在工作,我替换了这个:

var FullPath = ImageSource.FromFile(imageFile);

与:

 var FullPath = imageFile;

我没有注意到,Image source 在开始时返回带有一些额外文本的图像路径。例如: File: /data/user/0/com.companyname.appname/cache/cropped296.png

但是imageFile 只返回路径/data/user/0/com.companyname.appname/cache/cropped296.png

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 2019-04-10
    • 1970-01-01
    • 2015-04-19
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多