我有一个关于从iOS和Android的图库中获取照片并在CollectionView中显示它们的可能性的问题。我不想使用FIle Picker或Media Picker让用户能够选择和挑选照片,我想直接加载它们。从我的在线研究来看,Android 30+几乎不可能做到这一点。每当我尝试访问环境时,我甚至不确定如何开始处理这项任务。GetExternalDirectories我得到一个存储权限错误,说明我没有访问它,但我已经在manifest文件中授予了读写权限,并检查了它们是否被授予。就Ios而言,我不知道如何访问本地库路径,也不知道如何解决这个问题。任何想法都将非常感激。此外,我将不得不实现一个库监视器来跟踪何时添加新图像。
var path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).AbsolutePath;
try
{
string[] files = Directory.GetFiles(path);
foreach (var file in files)
{
try
{
var image = new Image
{
Source = ImageSource.FromFile(file)
};
var media = new MediaAsset
{
Path = file
};
MediaAssets.Add(media);
}
catch (Exception e)
{
// remove this if you don't want to see the exception message
continue;
}
}
}
catch (Exception)
{
return;
}
你在我的一篇文章下留言,已经被删除了,所以我就在这里回复你:
我只在Android上做了这个,但我猜它在IOS上也会类似,所以我使用了你在Xamarin中使用的相同的平台特定代码。形式
你通过[Android.App.Application.Context.ContentResolver]获得图像的路径。查询],然后将图像或缩略图加载到MemoryStream中,您将使用它来创建一个ImageSource,该ImageSource通过一个接口返回给主代码以在图像查看器中显示
它工作,但我记得我有一些问题与MAUI的稳定性(不记得他们是什么),导致我只是回到Xamarin。形式. .
这是我使用的图片/缩略图通过路径:
public async Task<MemoryStream> LoadThumbnail(string Path, int SizeX, int SizeY) {
var mem = new MemoryStream();
var bmp = Android.App.Application.Context.ContentResolver.LoadThumbnail(Android.Net.Uri.Parse(Path), new Android.Util.Size(SizeX, SizeY), null);
bmp.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, mem); bmp.Recycle();
mem.Seek(0, SeekOrigin.Begin);
return mem;
}
public async Task<MemoryStream> LoadPicture(string Path) {
var mem = new MemoryStream();
Android.App.Application.Context.ContentResolver.OpenInputStream(Android.Net.Uri.Parse(Path)).CopyTo(mem);
mem.Seek(0, SeekOrigin.Begin);
return mem;
}
那么你使用这样的代码:ImageSource.FromStream(() => Stream);
获取imageSource
PS:(只是为了帮助你在未来的问题,当你使用ImageSource从流,每次你加载它的流得到关闭,这就是为什么它使用lambda而不是一个直接的值,这样你就可以重新加载流)
编辑:这就是你获得画廊路径的方式:
var uriExternal = MediaStore.Images.Media.ExternalContentUri; //Since Android 12
string[] projection = { (MediaStore.Images.Media.InterfaceConsts.Id), (MediaStore.Images.Media.InterfaceConsts.DateAdded), (MediaStore.Images.Media.InterfaceConsts.RelativePath) };
var cursor = Android.App.Application.Context.ContentResolver.Query(uriExternal, projection, null, null, MediaStore.Images.Media.InterfaceConsts.DateAdded);
if (cursor != null) {
int columnIndexID = cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.Id);
int RelativePathID = cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.RelativePath);
while (cursor.MoveToNext()) {
//This is the image path on the Device
string RelativePath = cursor.GetString(RelativePathID);
//This is the path you'll use to load the Image
string ExternalSrcPath = uriExternal + "/" + cursor.GetLong(columnIndexID);
...
}
}