Итак, я создаю приложение для Android с .net Maui, которое считывает XML-файл из папки «Документы» (/storage/emulated/0/Documents). Приложение на 100% способно генерировать собственный XML-файл, чтобы гарантировать его постоянное существование. Однако, если я заменю XML, приложение выйдет из строя с исключением отказа в доступе. Я считаю, что это связано с тем, что я использую разрешения Storage_Read и Storage_Write вместо Manage_External_Storage. Сейчас я ищу обходной путь для получения этого разрешения, поскольку .net maui еще не обновил свою систему разрешений до уровня API 34.
Код, который запрашивает разрешения:
PermissionStatus lReadStatus = await Permissions.RequestAsync<Permissions.StorageRead>();
PermissionStatus lWriteStatus =await Permissions.RequestAsync<Permissions.StorageWrite>();
Мой Android Manifest.xml:
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE" />
Не позволяйте вашему приложению аварийно завершить работу, перехватив это исключение. Если есть исключение, отобразите тост пользователю, сообщающему об этом.
Эти разрешения на чтение и запись необходимы только для Android 12 и более ранних версий.
Разрешение на чтение никогда не работает для файлов, созданных не вашим приложением.
Manage_External_Storage. I am now Looking for a workaround to geting that permission since .net maui has not yet updated its permission system to API level 34. Управление внешним хранилищем есть начиная с Android 11. Не имеет никакого отношения к SDK 34.
Используйте платформу доступа к хранилищу, чтобы позволить пользователю выбирать файл. Ни одного разрешения не требуется.
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Поскольку сейчас написано, трудно точно сказать, о чем вы спрашиваете.





Чтобы проверить разрешение внешнего хранилища, вы можете использовать собственный код Android. Вот простой пример.
в Платформы -> Android добавьте файл CheckPermissions.cs
namespace CheckPermissionManager
{
public static class CheckPermission
{
public static bool CheckExternalStoragePermission()
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.R)
{
var result = Android.OS.Environment.IsExternalStorageManager;
if (!result)
{
var manage = Settings.ActionManageAppAllFilesAccessPermission;
Intent intent = new Intent(manage);
Android.Net.Uri uri = Android.Net.Uri.Parse("package:" + AppInfo.Current.PackageName);
intent.SetData(uri);
Platform.CurrentActivity.StartActivity(intent);
}
return result;
}
return true;
}
}
}
затем в любом месте кода:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void OnClicked(object sender, EventArgs e)
{
#if ANDROID
CheckPermissionManager.CheckPermission.CheckExternalStoragePermission();
#endif
}
}
Разрешение можно добавить только вручную со страницы настроек приложения. Приведенный выше код открывает страницу управления внешними разрешениями, если эти разрешения не добавлены.
Сменить его на сервис, вероятно, было бы хорошей идеей.
Вот реализация, которая ожидает завершения активности, а затем проверяет, дал ли пользователь разрешение.
public static class StorageHelper
{
public const int RequestCode = 2296;
private static TaskCompletionSource<bool>? GetPermissionTask { get; set; }
public static async Task<bool> GetManageAllFilesPermission()
{
try
{
Uri? uri = Uri.Parse("package:" + Platform.CurrentActivity.ApplicationInfo.PackageName);
GetPermissionTask = new();
Intent intent = new(global::Android.Provider.Settings.ActionManageAppAllFilesAccessPermission, uri);
Platform.CurrentActivity.StartActivityForResult(intent, RequestCode);
}
catch (Exception ex)
{
// Handle Exception
}
return await GetPermissionTask.Task;
}
public static void OnActivityResult()
{
GetPermissionTask?.SetResult(Environment.IsExternalStorageManager);
}
}
MainActivity.cs
protected override void OnActivityResult(int requestCode, Result resultCode, Intent? data)
{
if (requestCode == StorageHelper.RequestCode)
StorageHelper.OnActivityResult();
base.OnActivityResult(requestCode, resultCode, data);
}
Можете ли вы предоставить дополнительную информацию, особенно о том, как сохранить XML-файл? Я столкнулся с похожей проблемой, может быть, проверка на мой ответ на вопрос может вам помочь?