Вы должны спросить разрешения во время выполнения, даже если вы упомянули их в файле манифеста, если вы используете Android API уровня 23 или выше.
Посмотрите этот блог, который поможет узнать, как запросить разрешение во время выполнения: request-runtime-permissions-in-android
Кроме того, это официальный пример проверки RuntimePermissions
См .: xamarin-system-unauthorizedaccessexception-access-to-path-is-denied
Обновление:
Чтобы задать разрешения времени выполнения, вы можете использовать этот плагин: Plugin.Permissions , установите его в свой проект.
А затем позвоните CheckMyPermissionAsync();
перед загрузкой файла:
private void FabOnClick(object sender, EventArgs eventArgs)
{
View view = (View) sender;
CheckMyPermissionAsync();
}
В методе CheckMyPermissionAsync()
проверьте разрешение на хранение и загрузите файл:
public async void CheckMyPermissionAsync()
{
var permissionsStartList = new List<Permission>()
{
Permission.Storage
};
var permissionsNeededList = new List<Permission>();
try
{
foreach (var permission in permissionsStartList)
{
var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
if (status != PermissionStatus.Granted)
{
permissionsNeededList.Add(permission);
}
}
}
catch (Exception ex)
{
}
var results = await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeededList.ToArray());
//Check the persimmison again
var storeagePermission = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
if (storeagePermission == PermissionStatus.Granted)
{
//Download file here
DownloadFile("http://www.dada-data.net/uploads/image/hausmann_abcd.jpg", "XF_Downloads");
}
else {
Console.WriteLine("No permissions");
}
}
Вы можете проверить результат в завершенном событии:
private void Completed(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
Console.WriteLine("success");
}
else
{
if (OnFileDownloaded != null) { }
Console.WriteLine("fail");
}
}
Примечание: обратите внимание на ваш filePath, убедитесь, что ваш путь правильный, я использую:
string pathToNewFolder = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, folder);
Я обновил свой образец здесь: runtime-permission-xamarin.android