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

时间:2018-07-03 10:43:43

标签: c# android xamarin.forms uwp filesystems

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

System.UnauthorizedAccessException:'对路径'我尝试的任何可能路径(甚至超出Environment.SpecialFolder)的访问都被拒绝。“ < / b>

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

  • 我尝试通过DependencyService通过PCL和每个平台分别进行此操作。
  • 检查文件夹是否为只读
  • 以管理员权限启动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));
    

    3 个答案:

    答案 0 :(得分:3)

    您遇到权限问题。

    首先,您必须添加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://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/

    答案 1 :(得分:2)

    除了接受Bruno Caceiro's的答案外,您要声明的UWP权限如下:DocumentsLibrary用于文档,MusicLibrary用于音乐文件夹,依此类推。

    您可以通过右键单击项目->属性,然后单击Package Manifest并转到功能选项卡,以图形方式获得这些内容,如屏幕截图所示,或者右键单击package.appxmanifest并选择查看代码以编辑xml。有关如何声明功能的信息,请参见代码摘录。有些对话框中将没有表示形式。

    <Capabilities>
        <Capability Name="internetClient" />
        <uap:Capability Name="documentsLibrary"/>
        <uap:Capability Name="picturesLibrary" />
    </Capabilities>
    

    编辑,此外,您还可以使用rescap(受限功能)名称空间添加<rescap:Capability Name="broadFileSystemAccess" />来访问某些受限文件夹,以访问用户的任何文件/文件夹有权访问。

    Capabilities designer

    答案 2 :(得分:0)

    我在Android上遇到了同样的问题,我意识到问题是因为

    1. 我不得不询问运行时的权限,请记住,您需要 ACCESS_COARSE_LOCATION WRITE_EXTERNAL_STORAGE 权限

    2. 我使用了错误的路径,我的主要问题是实用地获取我无法解决的路径,我通过手动键入路径来解决了。我相信,如果您使用正确的完整路径(等存储/仿真/ 0 /),则不会遇到任何问题。