Xamarin.Forms Сохранение файла в файловой системе - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь загрузить файл из Интернета и сохранить в любом месте Environment.SpecialFolder. Независимо от того, какой подход я пробую - я всегда получаю

System.UnauthorizedAccessException: «Доступ к пути», любой возможный путь, который я пробую (даже за исключением Environment.SpecialFolder), «запрещен».

Я попытался получить доступ к файловой системе в 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));

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

В дополнение к принятому ответу Бруно Касейро, разрешения UWP, которые вы хотите объявить, следующие: DocumentsLibrary для документов, MusicLibrary для папки с музыкой и т. Д.

Вы можете получить к ним графическое представление, щелкнув правой кнопкой мыши по проекту -> Свойства и затем щелкнув Манифест пакета и перейдя на вкладку возможностей, как показано на скриншоте, или, альтернативно, щелкнув правой кнопкой мыши package.appxmanifest и выбрав код представления для редактирования XML. Смотрите отрывок кода для того, чтобы объявить о возможностях. У некоторых не будет представления в диалоге.

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

Редактировать Кроме того, вы также можете получить доступ к некоторым закрытым папкам, используя пространство имен rescap (с ограниченными возможностями), добавив <rescap:Capability Name="broadFileSystemAccess" />, чтобы получить доступ к любому файлу / папке, к которым у пользователя есть доступ.

Capabilities designer

0 голосов
/ 03 июля 2018

Вы столкнулись с проблемой разрешений.

Для начала вам нужно добавить в 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...