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

.NET MAUI在Android API 31使用MediaPicker拍照遇存储权限异常求助

解决Android API 31下.NET MAUI MediaPicker拍照的PermissionException问题

针对调用相机时抛出Microsoft.Maui.ApplicationModel.PermissionException(提示StorageWrite permission was not granted: Denied),以及权限声明的两难问题,以下是可行的解决方案:

1. 修正AndroidManifest.xml权限配置

API 31+ 已废弃WRITE_EXTERNAL_STORAGE权限,MAUI的MediaPicker在Android 12+环境下拍照不需要该权限——声明它反而会触发不必要的权限请求,用户拒绝后就会报错。修改后的配置如下:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACTION_OPEN_DOCUMENT" />
<uses-permission android:name="android.permission.ACTION_OPEN_DOCUMENT_TREE" />

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

<!-- 仅为Android 12及以下版本保留兼容性 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<queries>
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
</queries>

2. 代码中优先验证相机权限

在调用CapturePhotoAsync前,主动请求并验证相机权限,避免MediaPicker错误触发存储权限检查:

private async void TakePhotoPressed()
{
    // 检查并请求相机权限
    var cameraStatus = await Permissions.CheckStatusAsync<Permissions.Camera>();
    if (cameraStatus != PermissionStatus.Granted)
    {
        cameraStatus = await Permissions.RequestAsync<Permissions.Camera>();
        if (cameraStatus != PermissionStatus.Granted)
        {
            // 处理权限被拒绝的逻辑,比如提示用户无法拍照
            return;
        }
    }

    MediaPickerOptions options = new MediaPickerOptions();
    options.Title = "Add Attachment";
   
    FileResult result = await MediaPicker.Default.CapturePhotoAsync(options);
    // 后续照片处理逻辑
}

问题根源说明

Android 12(API 31)对存储权限做了大幅调整:WRITE_EXTERNAL_STORAGE被标记为废弃,应用无法再通过该权限写入公共外部存储。MAUI的MediaPicker在API 31+环境下,会将拍摄的照片保存到应用私有目录或通过系统MediaStore处理,完全不需要应用申请写外部存储权限。之前的两难情况,是因为声明了不必要的WRITE_EXTERNAL_STORAGE触发了权限请求流程,用户拒绝后MediaPicker抛出了错误的权限异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:05:53