You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:45:39