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