.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
相关产品推荐
相关产品推荐

