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);
用户在此页面可以直接开启应用的存储权限或「所有文件访问权限」。
三、权限请求的正确流程
- 权限检查逻辑
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; } }
- 权限申请逻辑
- 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
相关产品推荐
相关产品推荐

