.NET Android (MAUI) 低于13版本写入外部存储需重启才生效问题
解决.NET Android(MAUI)中Android低于13版本存储权限生效需重启的问题
针对你遇到的Android低于13版本中,授予存储权限后需重启应用才能写入外部存储的问题,可以从以下几个方面排查和修复:
1. 修正权限回调的判断逻辑
你的当前回调只检查了第一个权限(ReadExternalStorage)的授权状态,且逻辑判断有误。对于Android 12及以下版本,需要同时确认读写权限均被授予;而Android 10(API 29)及以上版本,还需处理分区存储的特殊权限要求。修改后的回调代码如下:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 100: { bool hasValidStorageAccess = false; if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) { // Android 13+ 无需WRITE_EXTERNAL_STORAGE,根据业务需求处理对应媒体权限即可 hasValidStorageAccess = true; } else if (Build.VERSION.SdkInt >= BuildVersionCodes.R) { // Android 10-12:检查是否获取了MANAGE_EXTERNAL_STORAGE权限(针对全存储访问) hasValidStorageAccess = Android.OS.Environment.IsExternalStorageManager; } else { // Android 9及以下:确认读写权限均被授予 hasValidStorageAccess = grantResults.All(result => result == Android.Content.PM.Permission.Granted); } if (hasValidStorageAccess) { // 权限验证通过后,立即触发一次存储操作以刷新权限状态 TriggerStorageAccessRefresh(); SendNavigationData(NavigatedFrom.StoragePermissionCard); } } break; default: Console.WriteLine("Unhandled option : " + requestCode); break; } } // 辅助方法:触发存储访问刷新,避免重启应用 private void TriggerStorageAccessRefresh() { var externalStorageDir = Android.OS.Environment.ExternalStorageDirectory; // 简单的存储操作,触发系统权限状态同步 _ = externalStorageDir.Exists; // 若业务需要,可在此处执行一次实际的文件读写测试 }
2. 完善AndroidManifest.xml权限声明
确保在项目的Platforms/Android/AndroidManifest.xml中添加对应版本的权限声明:
<!-- Android 9及以下所需权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 10-12 全存储访问所需权限(若业务需要访问任意目录) --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
3. 适配Android 10+分区存储规则
Android 10及以上默认启用分区存储,即使拥有读写权限,也无法直接访问外部存储的任意目录。若你的业务需要访问非媒体目录,需引导用户授予MANAGE_EXTERNAL_STORAGE权限:
// 在申请权限前,针对Android 10+检查是否需要跳转设置页 if (Build.VERSION.SdkInt >= BuildVersionCodes.R && !Android.OS.Environment.IsExternalStorageManager) { var intent = new Intent(Android.Provider.Settings.ActionManageAppAllFilesAccessPermission); intent.SetData(Android.Net.Uri.Parse($"package:{Android.App.Application.Context.PackageName}")); StartActivity(intent); }
通过以上调整,权限授予后即可在当前会话中立即访问外部存储,无需重启应用。
内容的提问来源于stack exchange,提问作者sampath kumar
相关产品推荐
相关产品推荐

