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

Xamarin Forms应用在Android 13上无法选择存储图片的问题求助

Android 13上Xamarin Forms选择图片权限问题修复方案

问题根源

  1. 版本判断错误:你将Android 12及以上都归为使用Photos权限,但Android 13(API 33)才正式废弃READ_EXTERNAL_STORAGE,改用READ_MEDIA_IMAGES权限,Android 12仍需依赖READ_EXTERNAL_STORAGE。
  2. 废弃权限请求:Android 13上Permissions.StorageRead对应的READ_EXTERNAL_STORAGE已被系统废弃,请求该权限会直接返回Denied,不会弹出授权对话框。
  3. 未校验权限结果:调用权限检查方法后未判断授权状态,即使权限未通过仍继续执行MediaPicker,触发权限异常。

修复步骤

1. 修正权限判断逻辑

针对不同Android版本区分权限类型,Android 13及以上使用Permissions.Photos,低版本使用Permissions.StorageRead。

2. 校验权限结果再执行后续操作

权限未授权时直接终止图片选择流程,避免触发异常。

3. 优化后完整代码

public async Task<bool> CheckAndRequestStoragePermission()
{
    PermissionStatus status = PermissionStatus.Unknown;

    if (DeviceInfo.Platform == DevicePlatform.Android)
    {
        Version version = DeviceInfo.Version;
        if (version.Major >= 13)
        {
            // Android 13+ 使用媒体图片权限
            status = await Permissions.CheckStatusAsync<Permissions.Photos>();
            if (status != PermissionStatus.Granted)
            {
                status = await Permissions.RequestAsync<Permissions.Photos>();
            }
        }
        else
        {
            // Android 12及以下 使用存储读取权限
            status = await Permissions.CheckStatusAsync<Permissions.StorageRead>();
            if (status != PermissionStatus.Granted)
            {
                status = await Permissions.RequestAsync<Permissions.StorageRead>();
            }
        }
    }
    else
    {
        // 非Android平台(如iOS)无需额外权限,直接返回授权状态
        status = PermissionStatus.Granted;
    }

    return status == PermissionStatus.Granted;
}

private async void OnChooseImageButtonClicked(object sender, EventArgs e)
{
    try
    {
        bool hasPermission = await CheckAndRequestStoragePermission();
        if (!hasPermission)
        {
            Console.WriteLine("存储权限未授权,无法选择图片");
            return;
        }

        var photo = await MediaPicker.PickPhotoAsync();
        if (photo != null)
        {
            imagePathList.Add(photo.FullPath);
            selectedImages.Add(new SelectedImage { ImagePath = photo.FullPath });
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"选择图片出错: {ex.Message}");
    }
}

4. 优化清单文件权限声明

为READ_EXTERNAL_STORAGE添加版本限制,避免在Android 13+系统中冗余声明:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

额外提示

  • Android 13上使用MediaPicker.PickPhotoAsync选择图片时,若仅获取临时路径,系统文件选择器会自动处理访问权限,无需应用额外申请;但如果需要直接读取图片文件内容,仍需确保READ_MEDIA_IMAGES权限已授权。
  • 若用户拒绝权限并勾选"不再询问",RequestAsync会直接返回Denied,此时可调用Permissions.OpenAppSettingsAsync()引导用户到应用设置页面手动开启权限。

内容的提问来源于stack exchange,提问作者Bhushan Akole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:25:25