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

Xamarin.Forms应用文件读写权限请求失败,如何正确获取权限?

Xamarin.Forms Android 文件读写权限问题解决方案

一、先确认AndroidManifest.xml权限配置

不同Android版本的存储权限要求不同,需对应配置:

<!-- Android 9及以下版本 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- Android 10版本:兼容旧存储模型 -->
<application android:requestLegacyExternalStorage="true" ...>

<!-- Android 11+版本:需要特殊权限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

二、打开当前应用专属权限设置页面

你之前调用的是全局文件权限设置页,正确的做法是直接跳转至当前应用的权限详情页,代码需在Android项目中实现(可通过DependencyService调用):

var intent = new Android.Content.Intent(Android.Provider.Settings.ActionApplicationDetailsSettings);
var uri = Android.Net.Uri.FromParts("package", Android.App.Application.Context.PackageName, null);
intent.SetData(uri);
intent.SetFlags(Android.Content.ActivityFlags.NewTask);
Android.App.Application.Context.StartActivity(intent);

用户在此页面可以直接开启应用的存储权限或「所有文件访问权限」。

三、权限请求的正确流程

  1. 权限检查逻辑
public bool HasStoragePermission()
{
    if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.R)
    {
        // Android 11+ 检查是否拥有所有文件访问权限
        return Android.OS.Environment.IsExternalStorageManager;
    }
    else
    {
        // 低版本检查读写权限
        var readGranted = ContextCompat.CheckSelfPermission(Android.App.Application.Context, 
            Android.Manifest.Permission.ReadExternalStorage) == Android.Content.PM.Permission.Granted;
        var writeGranted = ContextCompat.CheckSelfPermission(Android.App.Application.Context, 
            Android.Manifest.Permission.WriteExternalStorage) == Android.Content.PM.Permission.Granted;
        return readGranted && writeGranted;
    }
}
  1. 权限申请逻辑
  • Android 11+:MANAGE_EXTERNAL_STORAGE是特殊权限,无法通过常规弹窗请求,必须引导用户到上述应用专属设置页手动开启。
  • Android 10及以下:可使用Permissions.RequestAsync<Permissions.StorageWrite>()等常规方式请求权限,前提是已配置requestLegacyExternalStorage="true"。

四、规避权限问题的替代方案

如果不需要访问系统公共目录(如相册、下载文件夹),优先使用应用专属存储目录,无需申请任何权限:

// 外部专属存储(卸载应用时会被删除)
var externalAppDir = Android.App.Application.Context.GetExternalFilesDir(null);
// 内部专属存储
var internalAppDir = Android.App.Application.Context.FilesDir;

内容的提问来源于stack exchange,提问作者yaroslav_ch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:17:39