Xamarin Forms应用在Android 13上无法选择存储图片的问题求助
Android 13上Xamarin Forms选择图片权限问题修复方案
问题根源
- 版本判断错误:你将Android 12及以上都归为使用
Photos权限,但Android 13(API 33)才正式废弃READ_EXTERNAL_STORAGE,改用READ_MEDIA_IMAGES权限,Android 12仍需依赖READ_EXTERNAL_STORAGE。 - 废弃权限请求:Android 13上
Permissions.StorageRead对应的READ_EXTERNAL_STORAGE已被系统废弃,请求该权限会直接返回Denied,不会弹出授权对话框。 - 未校验权限结果:调用权限检查方法后未判断授权状态,即使权限未通过仍继续执行
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
相关产品推荐
相关产品推荐

