Невозможно записать в Android Внешнее хранилище даже с установленными разрешениями - PullRequest
0 голосов
/ 06 марта 2020

В моем Android 10.0 (Q) приложении, использующем формы Xamarin, я правильно установил в своем манифесте

<?xml version="1.0" encoding="utf-8"?>
<manifest **** />
    <application *** ></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

У меня есть разрешения, предоставленные с помощью кода

var permission = ActivityCompat.CheckSelfPermission(MainActivity.Instance, Manifest.Permission.WriteExternalStorage);

if (permission != Permission.Granted)
{
    ActivityCompat.RequestPermissions(
      MainActivity.Instance, 
      new[] 
      { 
         Manifest.Permission.WriteExternalStorage, 
         Manifest.Permission.ReadExternalStorage 
      }, 1);
}

Еще когда Я пытаюсь создать файл в папке с документами или изображениями. Я получаю сообщение об ошибке отказа в разрешении: Java .IO.FileNotFoundException: '/storage/emulated/0/Documents/file.txt: открыть не удалось: EACCES (разрешение отказано) ' Что мне не хватает?

var folder= Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments);
folder.Mkdirs();

var filePath = Path.Combine(folder.AbsolutePath, filename);

// I get a permissions error here 
using (var stream = new Java.IO.FileOutputStream(filePath))
{
     await stream.WriteAsync(data).ConfigureAwait(false);
}

1 Ответ

1 голос
/ 09 марта 2020

До того, как ваше приложение полностью совместимо с хранилищем области действия, вы можете временно отказаться от него в зависимости от целевого уровня SDK вашего приложения или атрибута манифеста requestLegacyExternalStorage:

У Google появилась новая функция в Android Q: фильтрованное представление для внешнего хранилища. Быстрое решение проблемы - добавить этот код в файл AndroidManifest. xml:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
    Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
   ...
 </application>
</manifest>
...