如何在Microsoft MAUI .Net中获取相册图片路径?
在MAUI中实现自定义相册图片选择器(Android + iOS)
Android 平台实现
权限配置
在Platforms/Android/AndroidManifest.xml中添加对应权限:
- Android 13及以上:添加
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> - Android 12及以下:添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
代码实现
MAUI中可沿用你在Xamarin.Android的核心逻辑,仅需调整Context获取方式:
using Android.App; using Android.Content; using Android.Provider; using Android.Net; using System.Collections.Generic; public async Task<List<Uri>> GetAllAndroidImagesAsync() { var imageUris = new List<Uri>(); // 检查并请求权限 var status = await Permissions.CheckStatusAsync<Permissions.Media>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.Media>(); if (status != PermissionStatus.Granted) { return imageUris; } } var context = Android.App.Application.Context; var uriExternal = MediaStore.Images.Media.ExternalContentUri; string[] projection = { MediaStore.Images.Media.InterfaceConsts.Id, MediaStore.Images.Media.InterfaceConsts.DateAdded, MediaStore.Images.Media.InterfaceConsts.RelativePath }; // 使用using自动释放cursor资源 using var cursor = context.ContentResolver.Query(uriExternal, projection, null, null, MediaStore.Images.Media.InterfaceConsts.DateAdded + " DESC"); if (cursor != null) { int columnIndexID = cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.Id); int RelativePathID = cursor.GetColumnIndexOrThrow(MediaStore.Images.Media.InterfaceConsts.RelativePath); while (cursor.MoveToNext()) { long imageId = cursor.GetLong(columnIndexID); Android.Net.Uri uriImage = Android.Net.Uri.WithAppendedPath(uriExternal, imageId.ToString()); imageUris.Add(uriImage); } } return imageUris; }
iOS 平台实现
权限配置
在Platforms/iOS/Info.plist中添加相册访问权限描述:
<key>NSPhotoLibraryUsageDescription</key> <string>需要访问您的相册以选择图片</string> <!-- iOS 14+ 如需限制仅访问选中图片,可选添加以下键 --> <key>NSPhotoLibraryAddUsageDescription</key> <string>需要访问您的相册以保存图片</string>
代码实现
iOS需使用Photos框架获取相册图片资源:
using Photos; using System.Collections.Generic; using System.Threading.Tasks; public async Task<List<NSUrl>> GetAlliOSImagesAsync() { var imageUrls = new List<NSUrl>(); // 检查并请求权限 var status = PHPhotoLibrary.AuthorizationStatus; if (status == PHAuthorizationStatus.NotDetermined) { status = await PHPhotoLibrary.RequestAuthorizationAsync(); } if (status != PHAuthorizationStatus.Authorized && status != PHAuthorizationStatus.Limited) { return imageUrls; } // 按创建时间倒序获取所有图片资源 var fetchOptions = new PHFetchOptions(); fetchOptions.SortDescriptors = new[] { new NSSortDescriptor("creationDate", true) }; var fetchResult = PHAsset.FetchAssets(PHAssetMediaType.Image, fetchOptions); foreach (PHAsset asset in fetchResult) { PHImageManager.DefaultManager.RequestImageDataAndOrientation(asset, null, (data, dataUti, orientation, info) => { if (info.TryGetValue(new NSString("PHImageFileURLKey"), out var urlObj) && urlObj is NSUrl url) { imageUrls.Add(url); } }); } return imageUrls; }
跨平台调用
在MAUI共享代码中,通过条件编译调用对应平台方法:
#if ANDROID var images = await GetAllAndroidImagesAsync(); #elif IOS var images = await GetAlliOSImagesAsync(); #endif
内容的提问来源于stack exchange,提问作者Robert258
相关产品推荐
相关产品推荐

