首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MAUI :System.UnauthorizedAccessException:拒绝对路径的访问

MAUI :System.UnauthorizedAccessException:拒绝对路径的访问
EN

Stack Overflow用户
提问于 2022-08-03 11:55:33
回答 2查看 556关注 0票数 0

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

代码语言:javascript
运行
复制
     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机器上运行良好,但该程序将System.UnauthorizedAccessException抛到安卓仿真器上。我已经在StackOverflow上搜索过这个问题,但大多数问题都是在Xamarin平台上进行的。(Xamarin.Android或Xamarin.Forms)

根据答案,我应该请求这样的存储许可:

首先,向我的AndroidManifest.xml添加以下代码:

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其次,检查目标android版本是Android还是above.If答案是正确的,然后调用RequestPermissions方法:

代码语言:javascript
运行
复制
#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“在当前上下文中不存在。

我猜它只存在于platform.Or中,它确实存在于另一个namespace.And中,这意味着我无法获得所需的读和写权限。

需要一个全新的许可问题解决方案。

**注:**我的英语是poor.And我有一点编程experience.Please原谅我。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-04 02:50:03

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

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

代码语言:javascript
运行
复制
 PermissionStatus statusread = await Permissions.RequestAsync<Permissions.StorageRead>();
 PermissionStatus statuswrite = await Permissions.RequestAsync<Permissions.StorageWrite>();

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

代码语言:javascript
运行
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-03 12:10:53

使用这个权限,希望它有帮助,手动检查一次。

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73221292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档