MAUI:System.UnauthorizedAccessException:拒绝访问路径



我正在制作一个新的跨平台MAUI应用程序,我试图简单地创建一个json文件。源代码如下:

private async void WriteSomething()
{
#if ANDROID
FileStream fs = new(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) + "/test.json", FileMode.Create);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
await sw.WriteAsync(str);
sw.Close();
fs.Close();
#elif WINDOWS
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\test.json";
FileStream fs = new(path, FileMode.Create);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
await sw.WriteAsync(str);
sw.Close();
fs.Close();
#endif
}

该程序在windows机器上运行良好,但在android模拟器上抛出System.UnauthorizedAccessException。我在StackOverflow上搜索过这个问题,但大多数关于这个问题的问题都在Xamarin平台上。(Xamarin.Android或Xamarin.Forms(

根据答案,我应该这样请求存储权限:

首先,将以下代码添加到我的AndroidManifest.xml中:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其次,检查目标android版本是否为android M或更高版本。如果答案是真的,那么调用RequestPermissions方法:

#if ANDROID
private void CheckAppPermissions()
{
if ((int)Build.VERSION.SdkInt < 23)
{
return;
}
else
{
if (PackageManager.CheckPermission(Manifest.Permission.ReadExternalStorage, PackageName) != Permission.Granted
&& PackageManager.CheckPermission(Manifest.Permission.WriteExternalStorage, PackageName) != Permission.Granted)
{
var permissions = new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage };
RequestPermissions(permissions, 1);
}
}
}
#endif

然而,我发现在Android命名空间中并没有这样的方法。

CS0103;RequestPermissions";不存在于当前上下文

我想它只存在于Xamarin平台中。或者它确实存在于另一个命名空间中。这意味着我无法获得所需的读写权限。

需要一个全新的权限问题解决方案。

**注:**我的英语很差。而且我几乎没有编程经验。请原谅我。

提前谢谢。

实际上,如果只在System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)路径中操作文件,它不需要任何存储权限。因为它是应用程序自己的私人文件夹。我已经在一个新项目中测试了你的代码,josn文件已经成功创建。

此外,如果你想在maui中请求权限,你需要使用maui中的api。您可以使用以下代码来代替您的代码。

PermissionStatus statusread = await Permissions.RequestAsync<Permissions.StorageRead>();
PermissionStatus statuswrite = await Permissions.RequestAsync<Permissions.StorageWrite>();

最后,您也可以使用Mahesh提到的权限,但在必要时应该使用它。如果你仍然想要它,你可以尝试在MainActivity中添加以下代码,由用户授予权限。

protected override void OnCreate(Bundle savedInstanceState)
{
if (!Android.OS.Environment.IsExternalStorageManager)
{
Intent intent = new Intent();
intent.SetAction(Android.Provider.Settings.ActionManageAppAllFilesAccessPermission);
Android.Net.Uri uri = Android.Net.Uri.FromParts("package", this.PackageName, null);
intent.SetData(uri);
StartActivity(intent);
}
base.OnCreate(savedInstanceState);
}

使用此权限,希望有帮助,检查一次并手动授予权限。

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> 

最新更新