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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:35:00