我有一個關于從 iOS 和 Android 的圖庫中獲取照片并將它們顯示在 CollectionView 中的可能性的問題。我不想使用 FIle Picker 或 Media picker 讓用戶能夠選擇和挑選我想直接加載的照片。根據我在網上的研究,針對 Android 30 的用戶幾乎不可能這樣做。我什至不確定在處理此任務時如何開始,每當我嘗試訪問 Environment.GetExternalDirectories 時,我都會收到一個存盤權限錯誤,說明我無權訪問它,但我已經在清單檔案中授予了讀取和寫入權限,并且檢查他們是否被授予。就 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;
}
uj5u.com熱心網友回復:
你在我的一篇帖子上寫了評論,它被洗掉了所以我就在這里回答你:
我只在 Android 上做過,但我想 IOS 會類似,所以我使用了與你將在 Xamarin.Forms 中使用的相同的 Plateform 特定代碼
你通過 [Android.App.Application.Context.ContentResolver.Query] 獲取影像的路徑,然后將影像或縮略圖加載到 MemoryStream 中,你將使用它來創建一個 ImageSource,你通過一個介面回傳到你的在影像查看器中顯示的主要代碼
它有效,但我記得我在 MAUI 穩定性方面遇到了一些問題(不記得它們是什么)導致我回到 Xamarin.Forms ..
這是我通過路徑用于圖片/縮略圖的內容:
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 而不是直接值的原因,這樣您就可以重新加載流)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533783.html
