System.UnauthorizedAccessException: доступ к пути запрещен - Хамарин - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть файл PDF для чтения, но я получаю исключение

System.UnauthorizedAccessException: Доступ к пути "/storage/emulated/0/geometry.pdf" запрещен.

Downloadbtn_click метод ниже

if (ContextCompat.CheckSelfPermission(this.Context, Manifest.Permission.ReadExternalStorage) != Permission.Granted)
{
   ActivityCompat.RequestPermissions(this.Activity, new String[] { Manifest.Permission.ReadExternalStorage }, 1);
}
else
{
    var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/" + fileName;
    //Below line getting exception
    System.IO.File.WriteAllBytes(externalPath, PdfBytes);
    var pdfPath = Android.Net.Uri.FromFile(new Java.IO.File(externalPath));
    Intent intent = new Intent(this.Activity.Intent.Action);
    intent.SetDataAndType(pdfPath, "application/pdf");
    this.Context.StartActivity(intent);
}

Переопределение OnRequestPermissionsResult метод

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
    case 1:
    {
        if (grantResults.Length > 0&& grantResults[0] == Permission.Granted)
        {
            var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/" + fileName;
            System.IO.File.WriteAllBytes(externalPath, bt);
            var pdfPath = Android.Net.Uri.FromFile(new Java.IO.File(externalPath));
            Intent intent = new Intent(this.Activity.Intent.Action);
            this.Context.StartActivity(intent);
        }
        return;
    }
}
}

Файл манифеста

<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Метод OnRequestPermissionsResult никогда не вызывается.При нажатии на кнопку «Загрузить» элемент управления непосредственно переходит к else детали, поскольку разрешение уже предоставлено в файле Menifest.xml.

Исключение составляет

System.IO.File.WriteAllBytes(externalPath, PdfBytes);

Как решить эту раздражающую проблему.

1 Ответ

0 голосов
/ 26 сентября 2018

Добро пожаловать в Android 8. У меня тоже была эта проблема.

Оказалось, что ReadExternalStorage больше не достаточно.Если вы зайдете в настройки приложения, вы увидите, что нет настроек чтения или записи, только доступ к файлу.Чтобы устранить проблему, запросите разрешения на чтение и запись, а также проверьте их оба:

{ Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage }

Разве не о записи?System.IO.File.WriteAllBytes (externalPath, PdfBytes);

Согласно документам это должно работать для чтения, но на самом деле это не работает для меня.

Согласно docs :

Разрешения

До Android 8.0 (уровень API 26), если приложение запрашивало разрешение во время выполнения, и разрешение было предоставлено, система также неправильнопредоставил приложению остальные разрешения, принадлежавшие той же группе разрешений и зарегистрированные в манифесте.

В приложениях, ориентированных на Android 8.0, это поведение было исправлено.Приложению предоставляются только те разрешения, которые оно явно запросило.Однако, как только пользователь предоставит разрешение приложению, все последующие запросы разрешений в этой группе разрешений будут автоматически предоставлены.

Например, предположим, что приложение перечисляет и READ_EXTERNAL_STORAGE, и WRITE_EXTERNAL_STORAGE в своем манифесте.Приложение запрашивает READ_EXTERNAL_STORAGE, и пользователь предоставляет его.Если приложение предназначено для уровня API 25 или ниже, система также предоставляет WRITE_EXTERNAL_STORAGE одновременно, поскольку оно принадлежит к той же группе разрешений STORAGE и также зарегистрировано в манифесте.Если приложение предназначено для Android 8.0 (уровень API 26), система предоставляет только READ_EXTERNAL_STORAGE в это время;однако, если приложение позднее запрашивает WRITE_EXTERNAL_STORAGE, система немедленно предоставляет эту привилегию без запроса пользователя.

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