Xamarin.Forms 在文件系统中保存文件

2024-03-09

我尝试从网络下载文件并将其保存到任何 Environment.SpecialFolder 位置。无论我尝试什么方法 - 我总是得到

System.UnauthorizedAccessException:“访问路径‘我尝试的任何可能路径(甚至超出Environment.SpecialFolder)’被拒绝。”

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

到目前为止我尝试过但没有运气:

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

  • Code sample:
    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,您需要询问用户权限,所以我建议使用该包权限.插件 https://github.com/jamesmontemagno/PermissionsPlugin

    并添加到您的 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/ https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/

    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    Xamarin.Forms 在文件系统中保存文件 的相关文章

    随机推荐