.NET MAUI中Permissions.Photos始终返回Granted及弹窗异常求助
.NET MAUI相册权限不弹窗、拍照多弹窗问题排查与解决
一、相册权限首次返回Granted且无弹窗的原因及修复
平台权限配置缺失
Android端需在AndroidManifest.xml中添加对应权限声明:Android 13+用READ_MEDIA_IMAGES,Android 12及以下用READ_EXTERNAL_STORAGE;iOS端需在Info.plist中添加NSPhotoLibraryUsageDescription键,填写访问相册的用途说明。若缺失配置,系统可能静默授予权限或无法触发弹窗。权限类型选择错误
Android 13+需使用Permissions.Photos.ReadOnly而非旧的Permissions.Photos,权限类型不匹配会导致状态判断异常。代码冗余优化
原代码中TaskCompletionSource属于冗余逻辑,简化后可避免异步流程出错:public static async Task<PermissionStatus> GetMediaPermissionStatus() { var status = await Permissions.CheckStatusAsync<Permissions.Photos>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.Photos>(); } return status; }
二、拍照时弹出两个权限弹窗的解决方法
拍照出现双弹窗,是因为MediaPicker.CapturePhotoAsync内部会同时请求相机权限和相册权限(默认需将照片保存至系统相册)。解决方式是提前主动申请相机权限:
public async void TakePhoto() { // 提前请求相机权限 var cameraStatus = await Permissions.CheckStatusAsync<Permissions.Camera>(); if (cameraStatus != PermissionStatus.Granted) { cameraStatus = await Permissions.RequestAsync<Permissions.Camera>(); if (cameraStatus != PermissionStatus.Granted) { // 权限被拒绝,可在此提示用户 return; } } if (MediaPicker.Default.IsCaptureSupported) { FileResult photo = await MediaPicker.Default.CapturePhotoAsync(); if (photo != null) { string localFilePath = Path.Combine(FileSystem.CacheDirectory, photo.FileName); using Stream sourceStream = await photo.OpenReadAsync(); using FileStream localFileStream = File.OpenWrite(localFilePath); await sourceStream.CopyToAsync(localFileStream); } } }
额外注意事项
- Android 13+权限拆分后,需在Manifest中分别添加
READ_MEDIA_IMAGES等细分权限,对应使用Permissions.Photos.ReadOnly请求。 - iOS所有权限请求必须在
Info.plist中添加用途描述,如相机需NSCameraUsageDescription,否则权限请求会被静默处理。
内容的提问来源于stack exchange,提问作者Mars
相关产品推荐
相关产品推荐

