gpt4 book ai didi

c# - Xamarin.Forms 在文件系统中保存文件

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:25 25 4
gpt4 key购买 nike

我尝试从 Web 下载文件并保存到任何 Environment.SpecialFolder 位置。无论我尝试哪种方法 - 我总是得到

System.UnauthorizedAccessException: 'Access to the path 'any possible path I try (even beyond Environment.SpecialFolder)' is denied.'

我尝试访问 UWP 和 Android 上的文件系统 - 都是相同的异常。

到目前为止,我试过但没有成功:

  • 我尝试通过 PCL 和使用 DependencyService 通过每个平台单独执行此操作。
  • 检查文件夹是否只读
  • 以管理员权限启动 Visual Studio
  • 将调试更改为发布
  • 尝试过 Xam.Plugins.DownloadManager

  • 代码示例:

    var webClient = new WebClient();
    webClient.DownloadDataCompleted += (s, e) => {
    var bytes = e.Result;
    string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
    string localFilename = "downloaded.jpg";
    string localPath = Path.Combine(documentsPath, localFilename);
    File.WriteAllBytes(localPath, bytes);
    };
    webClient.DownloadDataAsync(new Uri(url));

    最佳答案

    您遇到权限问题。

    首先,您必须在 AndroidManifest 中添加:

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

    而且由于 Android Marshmallow,您需要向用户询问权限,所以我建议使用包 Permissions.Plugin

    并在您的 MainActivity 中添加:

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
    PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    如果您有权限,您可以通过以下方式检查运行时:

    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
    if (status != PermissionStatus.Granted)
    {
    if(await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Storage))
    {
    await DisplayAlert("Need storage, "Request storage permission", "OK");
    }

    var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Storage);
    //Best practice to always check that the key exists
    if(results.ContainsKey(Permission.Storage))
    status = results[Permission.Storage];
    }

    有关更多信息,您可以查看这篇解释 Android 中所有权限的博文 - https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/

    关于c# - Xamarin.Forms 在文件系统中保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51152578/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com